You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Form Wizard中正确传递参数至表单?

Django Form Wizard 传递参数至表单的正确方式

问题原因

你遇到的错误是因为BaseFormSet的构造函数不接受自定义的month参数,但你通过get_form_kwargs把这个参数传递给了步骤1的FormSet,导致类型错误。需要针对普通表单和FormSet分别处理参数传递逻辑。

解决方案

1. 按步骤区分传递参数到普通表单

重写get_form_kwargs方法,仅给需要参数的普通表单(步骤0)传递month,跳过FormSet所在的步骤:

class MenuAddWizard(LoginRequiredMixin, SessionWizardView):
    # ... 其他原有代码 ...
    
    def get_form_kwargs(self, step=None):
        kwargs = super().get_form_kwargs(step)
        # 仅给步骤0的普通表单传递month参数
        if step == '0':
            kwargs.update({'month': self.kwargs['month']})
        return kwargs

2. 给FormSet中的子表单传递参数

对于步骤1的FormSet,需要在创建FormSet时通过form_kwargs参数,将month传递给FormSet内的每个子表单。修改你重写的get_form方法:

def get_form(self, step=None, data=None, files=None):
    form = super().get_form(step, data, files)
    if step is None:
        step = self.steps.current
    if step == '1':
        step_0_cleaned_data = self.get_cleaned_data_for_step('0')
        DayMenuFormSet = formset_factory(form=DayMenuForm, extra=0)
        # 新增form_kwargs参数,将month传递给每个子表单
        formset = DayMenuFormSet(
            initial=[{'menu': 'Some example text'}, {'menu': 'This is another test...'}],
            data=data,
            form_kwargs={'month': self.kwargs['month']}
        )
        form = formset
    return form

3. 确保表单类正确接收参数

保持表单类的__init__方法逻辑不变,注意必须调用父类的构造函数:

class DayMenuForm(forms.Form):
    # ... 表单字段定义 ...
    
    def __init__(self, *args, **kwargs):
        self.month = kwargs.pop('month', None)
        super().__init__(*args, **kwargs)
        # 后续可使用self.month执行验证或其他逻辑

说明

  • 普通表单(如步骤0的MenuInputForm)通过get_form_kwargs直接接收参数;
  • FormSet本身不支持自定义参数,需通过form_kwargs将参数传递给其内部的每个子表单;
  • 所有需要使用month参数的表单,都要在__init__中弹出并保存该参数,再调用父类构造函数。

内容的提问来源于stack exchange,提问作者SaeX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:53:27