Wtforms:添加具有多重继承的动态字段

jum*_*pap 5 python forms wtforms

我知道我可以创建这样的动态字段:http : //wtforms.simplecodes.com/docs/1.0.1/specific_problems.html#dynamic-form-composition

但是上述解决方案对于我来说是笨拙的,并且需要一个我想避免的特殊API。我想知道是否有一种方法可以使它与多重继承一起工作?我尝试了以下操作,但它不起作用,我也不知道为什么,我认为WTForms应该根据类结构的工作方式正确地绑定表单:

>>> class Base(Form):
...     def __init__(self, **kwargs):
...         setattr(self, 'dynamic_boolean', fields.BooleanField('label'))
...         super(Base, self).__init__(**kwargs)
... 
>>> class Inherit(Base):
...     other_boolean = fields.BooleanField('label')
... 
>>> 
>>> form = Inherit()
>>> form.__dict__
{'dynamic_boolean': <UnboundField(BooleanField, ('label',), {})>, 'other_boolean': <wtforms.fields.core.BooleanField object at 0x8a8510c>, '_fields': {'other_boolean': <wtforms.fields.core.BooleanField object at 0x8a8510c>}, '_prefix': '', '_errors': None}
Run Code Online (Sandbox Code Playgroud)

如您所见,dynamic_boolean是未绑定的。如何设置此值,以便正确绑定dynamic_boolean字段?

Cra*_*ast 5

WTForms使用元类在实例化时处理绑定。这个元类 Form.__init__调用之前就已经完成了工作,因此无法在其中__init__创建绑定的字段。

完成WTForms的设计方式是为了减少仅在第一次实例化表单时才进行的查找和查找字段类的工作量,从而加快了初始请求后的应用程序速度。


或者,如果您愿意承担一些麻烦,则可以基于BaseForm并使用您自己的元类来设计类似于Form的东西来支持这种行为。请注意,BaseForm与Form是不同的东西,它纯粹是一种底层方法,旨在供互补库的作者使用以构建相似的工具。