我正在try 使用Wizard View将数据从我的视图传递到我的表单类.

如果没有Wizard View,我会使用get_forms_kwargs()个来执行此操作,如下所示:

def get_form_kwargs(self):
    kwargs = super(MenuAddWizard, self).get_form_kwargs()
    kwargs.update({'month': self.kwargs['month']})
    return kwargs

在我的表单类中我用途:

def __init__(self, *args, **kwargs):
    self.month = kwargs.pop('month', None)

一切都很好-我可以使用"月"进行验证,例如clean().

但当我使用Wizard View时,我会按照docs指定get_forms_kwargs()中的步骤如下:

def get_form_kwargs(self, step=0):
    kwargs = super(MenuAddWizard, self).get_form_kwargs()
    kwargs.update({'month': self.kwargs['month']})
    return kwargs

我的get_form()不喜欢这样:

  File "python312\Lib\site-packages\formtools\wizard\views.py", line 311, in post
    return self.render_next_step(form)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "python312\Lib\site-packages\formtools\wizard\views.py", line 322, in render_next_step
    new_form = self.get_form(
               ^^^^^^^^^^^^^^
  File "myproject\views.py", line 1614, in get_form
    form = super().get_form(step, data, files)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "python312\Lib\site-packages\formtools\wizard\views.py", line 432, in get_form
    return form_class(**kwargs)
           ^^^^^^^^^^^^^^^^^^^^
TypeError: BaseFormSet.__init__() got an unexpected keyword argument 'month'

知道如何使用Django Form Wizard将kwargs(或任何其他方式)正确传递到表单吗?

供参考,完整视图如下(不含get_forms_kwargs()):

class MenuAddWizard(LoginRequiredMixin, SessionWizardView):

    # Either provide form_list as part of .as_view() in urls, or here.
    form_list = [MenuInputForm, DayMenuFormSet]
    template_name = "menu_add.html"

    def get_context_data(self, form, **kwargs):
        context = super(MenuAddWizard, self).get_context_data(form=form, **kwargs)
        month = self.kwargs['month']
        context['month'] = month
        return context

    def get_form_kwargs(self):
        kwargs = super(MenuAddWizard, self).get_form_kwargs()
        kwargs.update({'month': self.kwargs['month']})
        return kwargs

    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')
            # Using step 0 data, I generate the list to be used for initial; removing logic for brevity and using two example items as test

            DayMenuFormSet = formset_factory(form=DayMenuForm, extra=0)
            formset = DayMenuFormSet(initial=[{'menu': 'Some example text'}, {'menu': 'This is another test...'}],
                                     data=data)

            form = formset

        return form

我的表格都继承了标准forms.Form.

推荐答案

您似乎使用了FormSet,可能是根据您的表格制作的.然后您需要将这些值传递给form_kwargs=… parameter [Django-doc],所以:

def get_form_kwargs(self, *args, **kwargs):
    result = super().get_form_kwargs(*args, **kwargs)
    result.update(form_kwargs={'month': self.kwargs['month']})
    return result

或者也许更简单:

def get_form_kwargs(self, *args, **kwargs):
    return {
        **super().get_form_kwargs(*args, **kwargs),
        'form_kwargs': {'month': self.kwargs['month']},
    }

EDIT:问题似乎是您在某个步骤中使用FormSet,而在其他步骤中使用(简单的)Form.

如果是(简单)形式,则应将值传递为month,如果是FormSet,则应将值传递为form_kwargs,因此:

class MenuAddWizard(LoginRequiredMixin, SessionWizardView):
    # …

    def get_form_kwargs(self, step=None, *args, **kwargs):
        result = super().get_form_kwargs(step=step, *args, **kwargs)
        if str(step) == '0':
            result.update(month=self.kwargs['month'])
        else:
            # if used for a forms in a FormSet, probably not
            # result.update(form_kwargs={'month': self.kwargs['month']})
            pass
        return result

    # …

Note:自PEP-3135 [pep]起,如果第一个参数是定义方法的类,而第二个参数是函数的第一个参数(通常为self),则不需要用参数调用super(…).

Django相关问答推荐

POST_SAVE接缝有错误

为什么Docker compose没有这样的文件或目录?

Django:如何 Select 没有其他项目引用的项目?

Django 隐藏特定人员的媒体文件链接

如何在Django模板中有条件地传递值给with变量?

如何连接到 docker 容器中的 postgres 数据库?

Django中的多对多关系?

所有子元素的Django自递归外键过滤器查询

用于测试文件下载的 Django 单元测试

Django中的单表继承

django.request 记录器没有传播到根目录?

如何动态检索 Django 模型类?

django-object-permissions Vs django-guardian Vs django-authority

从 virtualenv 中,pip freeze > requirements.txt 给出了一堆垃圾!如何修剪它?

django admin 排序外键字段列表

django 模板列表变量中的最后一个元素

在 Django 中的字段中添加额外的约束

在 django 中获取空查询集的类名

运行单元测试时禁用 Django South?

Django:按位置排序,忽略 NULL