如何在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
相关产品推荐
相关产品推荐

