Использование комбинации 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 с некоторым успехом.

Другие вопросы по тегам