如何将以前的表单数据传递给FormWizard中DynamicForm的构造函数

Boz*_*Joe 12 django django-formwizard

我有一个FormWizard,我需要第一个表单中的数据传递给第二个表单的构造函数,以便我可以构建一个动态表单.

我可以通过FormWizard的process_step获取第一个表单的数据.

我使用字段列表的数据库调用创建第二个窗体的字段.

class ConditionWizardDynamicQuestions(forms.Form):

    def __init__(self, DynamicQuestions=None, *args, **kwargs):
       super(ConditionWizardDynamicQuestions, self).__init__(*args, **kwargs)
       questions = Question.objects.filter(MYDATA = DATA_FROM_1STFORM)
       for q in questions:
            dynField = FieldFactory(q)
            self.fields[q.label] = dynField
Run Code Online (Sandbox Code Playgroud)

如何通过DATA_FROM_1STFORM


我的结果代码:我放弃了表单的init,并将其切换到CreateQuestions def.然后使用向导的get_form覆盖来在创建后更改表单.

class ConditionWizard(SessionFormWizard):
    def get_form(self, request, storage, step=None, data=None, files=None):
        form = super(ConditionWizard, self).get_form(request, storage, step, data, files)
        stepIndex = self.get_step_index(request, storage, step)
        if stepIndex == 1:
            form.CreateQuestions(request.session["WizardConditionId"])
        if stepIndex == 3:
            form.fields['hiddenConditionId'].initial = request.session["WizardConditionId"]
            form.fields['medicationName'].queryset = Medication.objects.filter(condition = request.session["WizardConditionId"])
        return form
Run Code Online (Sandbox Code Playgroud)

Nic*_*ieb 8

我通过覆盖WizardView的get_form_kwargs解决了这个问题.它通常只返回一个get_form填充的空字典,因此通过覆盖它来返回包含您需要预先填充的数据的字典,您可以将kwargs传递给表单init.

def get_form_kwargs(self, step=None):
    kwargs = {}
    if step == '1':
        your_data = self.get_cleaned_data_for_step('0')['your_data']
        kwargs.update({'your_data': your_data,})
    return kwargs
Run Code Online (Sandbox Code Playgroud)

然后,在你的表单init方法中,你可以在调用super之前弹出kwarg:

self.your_data = kwargs.pop('client', None)
Run Code Online (Sandbox Code Playgroud)


Jer*_*ell 5

FormWizard已经将每个前一个表单中的数据传递给下一个表单.如果要获取该数据以实例化一个类(例如,如果表单具有所需的特殊关键字参数),一种方法是通过覆盖get_form表单向导类来获取querydict .例如:

class SomeFormWizard(FormWizard):
    def get_form(self, step, data=None):
        if step == 1 and data: # change this to whatever step requires
                               # the extra data
            extra_data = data.get('key_from_querydict')
            if extra_data:
                return self.form_list[step](data,
                                            keyword_argument=extra_data,
                                            prefix=self.prefix_for_step(step),                                                                                                                                            
                                            initial=self.initial.get(step, None))
        # Fallback for the other forms.
        return self.form_list[step](data,
                                    prefix=self.prefix_for_step(step),                                                                                                                                            
                                    initial=self.initial.get(step, None))
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以parse_params(self, request, *args, **kwargs)在FormWizard中覆盖以访问url/request数据,就像在视图中一样,因此如果您有request.user所有表单所需的请求数据(例如),则可能是更好地从那里获取数据.

希望这可以帮助.