Django:为表单向导中的步骤动态设置表单集

Django:为表单向导中的步骤动态设置表单集,django,django-forms,django-formwizard,Django,Django Forms,Django Formwizard,作为Django视图中a的一部分,我使用a。每个步骤的向导表单声明如下: UserFormSet = modelformset_factory(account_models.MyUser, form=account_forms.MyUserForm, extra=5, max_num=

作为Django视图中a的一部分,我使用a。每个步骤的向导表单声明如下:

UserFormSet = modelformset_factory(account_models.MyUser,
                                   form=account_forms.MyUserForm, 
                                   extra=5, 
                                   max_num=10, 
                                   can_delete=True)

FORMS = [('userchoice', UserChoiceForm),
         ('user', UserFormSet),]
TEMPLATES = {'userchoice': "account/userchoice.html",
             'user': "account/user.html",}
form_list = [
        (FIRST_STEP, forms.FirstForm),
        (SECOND_STEP, modelformset_factory(Second_model, form=forms.SecondForm)),
    ]

def get_form_initial(self, step):
        """
        Set extra parameter for step2, which is from clean data of step1.
        """
        if step == self.SECOND_STEP:
            form_class = self.form_list[step]
            data = self.get_cleaned_data_for_step(self.FIRST_STEP)
            if data is not None:
                extra = get_extra_count(data) # use cleaned data calculate extra
                form_class.extra = extra
        return super(PackageWizard, self).get_form_initial(step)
我试图实现的是:在UserChoiceForm(第一步)中,可以设置所需的用户数。我想使用此值动态设置UserFormSet上的extra属性,以便在第二步中只显示所需数量的表单

我正试图通过覆盖向导的方法来完成此操作:

通过这种方法,我能够在第二步中获得正确数量的表单,但在尝试发布表单集时,我最终会出现以下错误:

[u'ManagementForm data is missing or has been tampered with']
POST数据设置了预期的管理表单字段,例如

form-TOTAL_FORMS    u'1'
但是我假设FormWizard正在使用初始表单列表中设置的表单集,因此管理表单不匹配


我想知道是否有解决方案,是否有办法告诉FormWizard使用POST上动态生成的Formset。

如果您收到此错误消息

[u'ManagementForm数据丢失或已被篡改']


在您的模板中,确保您提供了
{{wizard.form.management\u form}
您可以覆盖
获取表单首字母
,假设您已经设置了
表单列表

UserFormSet = modelformset_factory(account_models.MyUser,
                                   form=account_forms.MyUserForm, 
                                   extra=5, 
                                   max_num=10, 
                                   can_delete=True)

FORMS = [('userchoice', UserChoiceForm),
         ('user', UserFormSet),]
TEMPLATES = {'userchoice': "account/userchoice.html",
             'user': "account/user.html",}
form_list = [
        (FIRST_STEP, forms.FirstForm),
        (SECOND_STEP, modelformset_factory(Second_model, form=forms.SecondForm)),
    ]

def get_form_initial(self, step):
        """
        Set extra parameter for step2, which is from clean data of step1.
        """
        if step == self.SECOND_STEP:
            form_class = self.form_list[step]
            data = self.get_cleaned_data_for_step(self.FIRST_STEP)
            if data is not None:
                extra = get_extra_count(data) # use cleaned data calculate extra
                form_class.extra = extra
        return super(PackageWizard, self).get_form_initial(step)

除非您使用多线程,否则这种方法是有效的,因为它不是线程安全的。线程安全的方法可能是重写
get\u form
并动态构建表单集。