Сделать так, чтобы выбор формы 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")
Вернуться на верх