2014-02-13 101 views
5

作为我的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。

回答

0

如果您收到此错误信息,

[u'ManagementForm data is missing or has been tampered with']

在模板确保你给{{ wizard.form.management_form }}

4

您可以覆盖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) 
+0

这工作就像一个魅力,谢谢! :) – littlepea

+0

这种方法工作,除非你使用多线程,因为它不是线程安全的。 线程安全方法可能是重写'get_form'并动态构建您的表单集。 – lukewarm

相关问题