2015-11-20 117 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繼承的子窗體取得了一些成功。