Передача информации из представления в форму с помощью FormWizard

Я пытаюсь передать данные из моего представления в класс формы с помощью WizardView.

Без WizardView я делаю это с помощью get_forms_kwargs(), как показано ниже:

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

А в классе формы я использую:

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

Все хорошо - я могу использовать 'month' для валидации, например, в clean().

Однако, когда я использую WizardView, я указываю шаг в get_forms_kwargs() следующим образом, согласно docs:

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'

Есть идеи, как правильно передать kwargs (или любой другой способ) в форму с помощью Django Form Wizard?

You seem to use a FormSet, probably made out of your form. Then you need to pass the values through the form_kwargs=… parameter [Django-doc], so:

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, если оно предназначено для (простой) формы, и через form_kwargs для FormSet, так что:

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: Since PEP-3135 [pep], you don't need to call super(…) with parameters if the first parameter is the class in which you define the method, and the second is the first parameter (usually self) of the function.

Вернуться на верх