As part of a Form Wizard in my Django view I am using a Formset. The wizard's forms for each step are declared like this:
作为我的Django视图中的表单向导的一部分,我使用的是Formset。每个步骤的向导表单都声明如下:
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",}
What I am trying to achieve is this: In UserChoiceForm (first step) the number of required users can be set. I want to use this value to dynamically set the extra attribute on UserFormSet so that only the required number of Forms gets displayed in the second step.
我想要实现的是:在UserChoiceForm(第一步)中,可以设置所需用户的数量。我想使用此值在UserFormSet上动态设置额外属性,以便在第二步中仅显示所需数量的表单。
I am trying to do this by overriding the wizard's get_form() method:
我试图通过重写向导的get_form()方法来做到这一点:
class MyUserWizard(SessionWizardView):
def get_form(self, step=None, data=None, files=None):
form = super(MyUserWizard, self).get_form(step, data, files)
# Determine the step if not given
if step is None:
step = self.steps.current
if step == 'user':
# Return number of forms for formset requested
# in previous step.
userchoice = self.get_cleaned_data_for_step('userchoice')
num_users = userchoice['num_users']
CoFunderFormSet.extra = num_users
return CoFunderFormSet
return form
With this approach I am able to get the right amount of forms displayed for the second step, but when trying to post the Formset I am ending up with this error:
使用这种方法,我能够为第二步显示正确数量的表单,但是当尝试发布Formset时,我最终会遇到此错误:
[u'ManagementForm data is missing or has been tampered with']
The POST data has the expected management form fields set, e.g.
POST数据具有预期的管理表单字段集,例如,
form-TOTAL_FORMS u'1'
but I assume the FormWizard is using the Formset that was set in the initial FORMS list and therefore the management forms do not match.
但我假设FormWizard使用的是初始FORMS列表中设置的Formset,因此管理表单不匹配。
I was wondering if there is a solution to this and if there is a way to tell the FormWizard to use the dynamically generated Formset on POST instead.
我想知道是否有一个解决方案,如果有一种方法告诉FormWizard在POST上使用动态生成的Formset。
2 个解决方案
#1
5
You can override get_form_initial
, assume you have already set your form_list
like this:
你可以覆盖get_form_initial,假设你已经像这样设置了form_list:
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)
#2
0
If you get this error message,
如果您收到此错误消息,
[u'ManagementForm data is missing or has been tampered with']
[u'ManagementForm数据丢失或被篡改']
In your template make sure that you have given {{ wizard.form.management_form }}
.
在您的模板中,请确保您已提供{{wizard.form.management_form}}。
#1
5
You can override get_form_initial
, assume you have already set your form_list
like this:
你可以覆盖get_form_initial,假设你已经像这样设置了form_list:
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)
#2
0
If you get this error message,
如果您收到此错误消息,
[u'ManagementForm data is missing or has been tampered with']
[u'ManagementForm数据丢失或被篡改']
In your template make sure that you have given {{ wizard.form.management_form }}
.
在您的模板中,请确保您已提供{{wizard.form.management_form}}。