Передача информации из представления в форму с помощью 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 (usuallyself
) of the function.