我如何创建WTForms字段子类?

问题描述:

我想从wtforms的默认字段类创建子类。我如何创建WTForms字段子类?

class MyForm(Form): 
    fieldName = MyField('field name') 

和MyField的从另一个文件

class MyField(TextField): 
    def __init__(self): 
     super(MyField, self).__init__(**kwargs) 

进口,而当我创建一个MyForm的起源在这里存在一些误区:

In [5]: f = MyForm() 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
path/<ipython-input-5-decc3699f7c4> in <module>() 
----> 1 f = RegistrationForm() 

path/wtforms/form.pyc in __call__(cls, *args, **kwargs) 
    176    fields.sort(key=lambda x: (x[1].creation_counter, x[0])) 
    177    cls._unbound_fields = fields 
--> 178   return type.__call__(cls, *args, **kwargs) 
    179 
    180  def __setattr__(cls, name, value): 

path/wtforms/form.pyc in __init__(self, formdata, obj, prefix, **kwargs) 
    222    of a matching keyword argument to the field, if one exists. 
    223   """ 
--> 224   super(Form, self).__init__(self._unbound_fields, prefix=prefix) 
    225 
    226   for name, field in iteritems(self._fields): 

pathwtforms/form.pyc in __init__(self, fields, prefix) 
    37 
    38   for name, unbound_field in fields: 
---> 39    field = unbound_field.bind(form=self, name=name, prefix=prefix, translations=translations) 
    40    self._fields[name] = field 
    41 

path/wtforms/fields/core.pyc in bind(self, form, name, prefix, translations, **kwargs) 
    299 
    300  def bind(self, form, name, prefix='', translations=None, **kwargs): 
--> 301   return self.field_class(_form=form, _prefix=prefix, _name=name, _translations=translations, *self.args, **dict(self.kwargs, **kwargs)) 
    302 
    303  def __repr__(self): 

TypeError: __init__() got an unexpected keyword argument '_form' 

我猜想_form场不实例化正确。 任何想法如何做到这一点? 谢谢

+0

你发布的内容根本无法正常工作,而且最重要的是不能产生你所说的错误(它不会那么快)。首先,你要在定义之前实例化MyField,如果你解决了这个问题,你传递一个参数给它,但是你没有写它来接受任何参数。这些都会导致您甚至在调用父类之前发生的错误。请张贴代码,*实际上只展示您询问的错误。* – kindall

+0

MyField类在另一个文件中定义。我编辑了这篇文章。 – d3m

您的MyField.__init__方法缺少必需的关键字参数。试试这个:

class MyField(TextField): 
    def __init__(self, **kwargs): # You were missing the **kwargs 
     super(MyField, self).__init__(**kwargs) 

***运营商在函数调用执行下列操作(?):

  • 如果函数签名使用他们指定的所有剩余位置(*)或关键词(**)参数应分别放置在tuple/dict(分别)中,并且数据应绑定到跟在*/**后面的名称。
  • 如果在一个函数调用使用他们指定的tuplelist(为*)或dict(为**)应该是解压并传递给功能的参数/键字参数列表。