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

时间:2014-05-11 15:26:10

标签: 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}

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

1 个答案:

答案 0 :(得分:4)

WTForms使用a metaclass在实例化时处理绑定。此元类在调用 Form.__init__之前完成其工作,从而使__init__中的某些内容无法创建绑定的字段。

设计WTForms的方式是为了减少在搜索和查找字段类时要完成的工作量,只有在第一次实例化表单时才会发生,从而在初始请求后加速应用程序。


或者如果您愿意加入legwork,可以根据BaseForm并使用您自己的元类设计类似于支持此行为的Form。请注意,BaseForm与Form不同,它纯粹是为补充库的作者设计的低级方法,可以访问构建类似的工具。