我正在为我的项目使用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
。其他时候,obj
或prefix
似乎是unexpected
关键字。
我的代码出了什么问题?
答案 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并取得了一些成功。