2015-11-20 114 views
0

我在我的项目中使用了jinja2和wtforms的组合,我需要在FieldList中使用FormField。以下代码不起作用,但会引发异常。结合使用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关键字。

我的代码有什么问题?

回答

0

问题是您的子窗体的构造函数(通过BaseForm)接受不同的内置wtforms“Form”构造函数的参数。

内置形式初始化的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) 因此,基本形式构造需要接受要被包封在适当的参数FormField对象。

解决方案似乎要么继承SubForm中的“Form”,要么将所需的支持添加到BaseForm。

我目前正在通过似乎是在webapp2应用程序中相同的问题,我正在测试具有从窗体而不是BaseForm继承的子窗体取得了一些成功。