使用FieldList和FormField的组合会导致异常

时间:2015-11-20 00:10:46

标签: wtforms formfield fieldlist

我正在为我的项目使用jinja2和wtforms的组合,我需要在FieldList中使用FormField。以下代码不起作用但抛出异常。

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。其他时候,objprefix似乎是unexpected关键字。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

问题是你的子表单的构造函数(通过BaseForm)接受与内置wtforms的形式不同的参数" Form"构造函数。

内置于 init 的wtforms具有以下签名: 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并取得了一些成功。