Wtforms:使用多重继承添加动态字段

6
我知道我可以像这样创建动态字段: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字段正确地绑定呢?


您的主题似乎与您的问题不符。WTForms确实支持多重继承,但这与您尝试做的事情无关,这类似于动态组合。 - Crast
1个回答

8

WTForms使用元类来处理实例化时的绑定。这个元类在调用Form.__init__之前就完成了它的工作,因此不可能在__init__中创建一个已绑定的字段。

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


或者 如果您愿意付出努力,可以设计类似于Form的支持此行为的东西,基于BaseForm并使用自己的元类。请注意,BaseForm与Form不是同一回事,它仅是一种低级方式,旨在让补充库的作者获得构建类似工具的访问权限。


添加一个返回新表单的classmethod也可以。或许能帮助某人找到正确的方向。 - wanaryytel
1
有人做了功课并愿意分享吗? - Tomvkgames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接