Django:为表单向导中的步骤动态设置表单集
作为Django视图中a的一部分,我使用a。每个步骤的向导表单声明如下: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=
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
并动态构建表单集。