作为我的Django视图中Form Wizard的一部分,我使用的是Formset。该向导的每个步骤的形式声明如下: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",}
我想实现的是:在UserChoiceForm(第一步)所需要的用户数量进行设置。我想使用此值动态设置UserFormSet上的额外属性,以便在第二步中只显示所需数量的表单。
我试图通过覆盖向导的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
用这种方法我能够得到的第二个步骤中显示的形式适量,而是试图发布表单集时我结束了这个错误:
[u'ManagementForm data is missing or has been tampered with']
POST数据有预期的管理窗体域设置,例如
form-TOTAL_FORMS u'1'
但我假设FormWizard使用在初始FORMS列表中设置的Formset,因此管理窗体不匹配。
我想知道是否有解决方案,以及是否有办法告诉FormWizard在POST上使用动态生成的Formset。
这工作就像一个魅力,谢谢! :) – littlepea
这种方法工作,除非你使用多线程,因为它不是线程安全的。 线程安全方法可能是重写'get_form'并动态构建您的表单集。 – lukewarm