Сделать так, чтобы выбор формы Django зависел от значений, представленных в предыдущей форме
Я использую django-formtools для создания многошагового мастера формы. Я хочу использовать данные, введенные на первом шаге, для вызова API, а затем использовать данные ответа на следующем шаге в качестве ChoiceField
. Вот как выглядит мой код в настоящее время:
views.py
from server.companies.models import Company
from server.data_sources.models import DataDictionary, DataSource
from django.shortcuts import render
from formtools.wizard.views import SessionWizardView
import json
import logging
from server.data_sources import ds
from server.data_sources.models import SOURCE
logger = logging.getLogger("server." + __name__)
def create_records(data):
if not data or data == {}:
return
name = data.get("company_name")
is_sandbox = data.get("is_sandbox")
city = data.get("city")
state = data.get("state")
username = data.get("username")
password = data.get("password")
data_source = DataSource.objects.create(
name=name,
source_type=SOURCE,
)
ds.login(data_source, username, password)
company = Company.objects.create(
name=name,
data_source=data_source,
)
return company
class Wizard(SessionWizardView):
template_name = "wizard.html"
def done(self, form_list, **kwargs):
return render(
self.request,
"done.html",
{"form_data": [form.cleaned_data for form in form_list]},
)
def get_form_step_data(self, form):
return form.data
def get_form(self, step=None, data=None, files=None):
form = super().get_form(step, data, files)
company = None
# determine the step if not given
if step is None:
step = self.steps.current
if step == "0":
if form.is_valid():
step_zero_data = form.cleaned_data
company = create_records(step_zero_data)
source = company.data_source
data_dict = {}
for field in ds.select(
company, "DATADICT", ["dd_dbf", "dd_name", "dd_desc"]
):
table = field["dd_dbf"]
field_name = field["dd_name"]
try:
data_dict[table] += [field_name]
except KeyError:
data_dict[table] = {}
data_dict[table] = []
data_dict[table] += [field_name]
# Find the existing data dictionary stored
data_dict_json = json.dumps(data_dict, indent=4)
existing_data_dict = DataDictionary.objects.filter(
data_source=source
).first()
if existing_data_dict:
existing_data_dict.data = data_dict_json
existing_data_dict.save()
else:
DataDictionary.objects.create(
data_source=source, data=data_dict_json
)
if step == "1":
pass
return form
urls.py
from django.conf.urls import url
from .forms import CustomerAccountCreationForm, CustomerWORequiredFieldsForm
from .views import ContactWizard
customer_creation_wizards_forms = [
CustomerAccountCreationForm,
CustomerWORequiredFieldsForm,
]
urlpatterns = [
url(
r"^customers/",
ContactWizard.as_view(
customer_creation_wizards_forms,
),
),
]
forms.py
Здесь я хочу иметь динамическое поле выбора. Я хотел бы использовать данные в моем представлении (data_dict
) для заполнения этих вариантов. Есть ли у кого-нибудь идеи, как этого добиться?
from django import forms
class CustomerAccountCreationForm(forms.Form):
company_name = forms.CharField(max_length=100, label="Company Name")
city = forms.CharField(max_length=100, label="Company City")
state = forms.CharField(max_length=100, label="Company State")
class CustomerWORequiredFieldsForm(forms.Form):
DYNAMIC_CHOICES = (
("1", "1"),
("2", "2"),
("3", "3"),
)
company_level_login = forms.BooleanField(
required=False, label="Company Level Login?"
)
is_closed_on_completion = forms.BooleanField(
required=False, label="Close WOs on completion?"
)
field_mapping = forms.CharField(max_length=100, label="Field Mapping")