我如何创建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场不实例化正确。 任何想法如何做到这一点? 谢谢
答
您的MyField.__init__
方法缺少必需的关键字参数。试试这个:
class MyField(TextField):
def __init__(self, **kwargs): # You were missing the **kwargs
super(MyField, self).__init__(**kwargs)
的*
和**
运营商在函数调用执行下列操作(?):
- 如果函数签名使用他们指定的所有剩余位置(
*
)或关键词(**
)参数应分别放置在tuple
/dict
(分别)中,并且数据应绑定到跟在*
/**
后面的名称。 - 如果在一个函数调用使用他们指定的
tuple
或list
(为*
)或dict
(为**
)应该是解压并传递给功能的参数/键字参数列表。
你发布的内容根本无法正常工作,而且最重要的是不能产生你所说的错误(它不会那么快)。首先,你要在定义之前实例化MyField,如果你解决了这个问题,你传递一个参数给它,但是你没有写它来接受任何参数。这些都会导致您甚至在调用父类之前发生的错误。请张贴代码,*实际上只展示您询问的错误。* – kindall
MyField类在另一个文件中定义。我编辑了这篇文章。 – d3m