Использование комбинации FieldList и FormField приводит к исключению
Я использую комбинацию jinja2 и wtforms для своего проекта, где я должен использовать FormField в FieldList. Следующий код не работает, но выдает исключение.
class FormTranslations(object):
def gettext(self, string):
return gettext(string)
def ngettext(self, singular, plural, n):
return ngettext(singular, plural, n)
class BaseForm(Form):
def __init__(self, request_handler):
super(BaseForm, self).__init__(request_handler.request.POST)
def _get_translations(self):
return FormTranslations()
class SubForm(BaseForm):
name = fields.StringField()
qty = fields.IntegerField()
class MainForm(BaseForm):
value = fields.IntegerField()
items = fields.FieldList(fields.FormField(SubForm), min_entries=2)
#Instantiate and initialize the MainForm:
f = MainForm(self)
Exception:
…
…
…
File "/src/external/wtforms/form.py", line 178, in __call__
return type.__call__(cls, *args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'formdata'
Иногда это formdata
, Некоторые другие времена, это obj
или же prefix
это кажется unexpected
ключевое слово.
Что не так с моим кодом?
1 ответ
Проблема заключается в том, что конструктор вашей подчиненной формы (через BaseForm) принимает параметры, отличные от встроенного конструктора wtforms "Form".
Встроенная в wtforms форма init имеет следующую подпись:
def __init__(self, formdata=None, obj=None, prefix='', **kwargs):
Объект FormField создает инкапсулированную форму со следующей логикой:
if isinstance(data, dict):
self.form = self.form_class(formdata=formdata, prefix=prefix, **data)
else:
self.form = self.form_class(formdata=formdata, obj=data, prefix=prefix)
Таким образом, конструктору BaseForm необходимо принять соответствующие параметры для инкапсуляции в объекте FormField.
Решение, по-видимому, заключается в том, чтобы либо унаследовать "Form" в вашей SubForm, либо добавить необходимую поддержку в BaseForm.
В настоящее время я работаю над тем, что кажется той же проблемой в приложении webapp2, и я тестирую, что подчиненная форма наследуется от Form вместо BaseForm с некоторым успехом.