【问题标题】:Adding Forms to a Formset based on previous FormWizard step根据前面的 FormWizard 步骤将表单添加到 Formset
【发布时间】:2014-03-25 12:12:39
【问题描述】:

我一直在努力解决这个问题,似乎无法找到解决方案......

我有一个 FormWizard,它包含两个步骤:一个 Form (step0),然后是一个 FormSet (step1):

forms.py

# Step 0
class StrategyForm(forms.ModelForm):
     class Meta:
        model = Strategy

# Step 1
class LegForm(forms.ModelForm):
    class Meta:
        model = Leg

LegFormSet = formset_factory(LegForm, max_num=10)

在 step0 中,用户输入一个数字,我想在 FormSet 中将其用作“额外”,即如果用户在 step0 中输入 10,我希望 FormSet 在下一步中显示 10 个 Forms .

我根据其他问题尝试了以下方法,但似乎找不到解决方案:

views.py

def get_form(self, step=None, data=None, files=None):
    if step is None:
        step = self.steps.current

    form = super(DealWizard, self).get_form(step, data, files)

    if step == 'leg':
        form.extra = 10
    return form

def get_form(self, step=None, data=None, files=None):
    if step is None:
        step = self.steps.current

    form = super(DealWizard, self).get_form(step, data, files)

    if step == 'leg':
        mgmt_form = form.management_form
        mgmt_form.initial[INITIAL_FORM_COUNT] = 10
        mgmt_form.initial[TOTAL_FORM_COUNT] = 10

    return form

我(非常)是 django 新手,所以任何建议都会有所帮助 :)

【问题讨论】:

    标签: python django formset


    【解决方案1】:

    试试这个:

    def get_form(self, step=None, data=None, files=None):
        if step is None:
            step = self.steps.current
        if step == "1": 
            prev_data = self.get_cleaned_data_for_step(self.get_prev_step(
                                                         self.steps.current))
            cnt = prev_data['extra_from_step0'] #use appropriate key as per your form
    
            return formset_factory(LegForm, extra=cnt, max_num=cnt) 
    
        return super(YourFormWizard, self).get_form(step, data, files)
    

    它覆盖 get_form() 方法以从上一步获取计数并返回 formset_factory() 以及使用 max_num 的许多表单。

    作为侧节点,您可能需要使用modelformset_factory()

    【讨论】:

    • 我已编辑您的代码以更改添加“extra=cnt”,这是定义显示多少表单的参数。除此之外,它完美无缺!
    • 还添加了 '(data)' 以确保我们返回的是 instance,而不是类 -- 没有这个,下一步验证将失败(因为 'form.is_valid ()' 无法运行)。
    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2023-03-19
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    相关资源
    最近更新 更多