【问题标题】:Wtforms: adding dynamic fields with multiple inheritanceWtforms:添加具有多重继承的动态字段
【发布时间】:2014-05-21 07:46:24
【问题描述】:

我知道我可以创建这样的动态字段: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确实支持多重继承,但这与你想要做的事情无关,这类似于动态组合。

标签: python forms wtforms


【解决方案1】:

WTForms 使用a metaclass 在实例化时处理绑定。这个元类Form.__init__被调用之前完成它的工作,因此__init__中的某些东西不可能创建一个绑定的字段。

WTForms 的设计方式旨在减少搜索和查找字段类的工作量,仅在第一次实例化表单时发生,从而在初始请求后加速您的应用程序。


交替如果您愿意投入大量精力,可以基于BaseForm 并使用您自己的元类来设计类似于Form 的东西来支持这种行为。请注意,BaseForm 与 Form 不同,它纯粹是一种低级方式,专为补充库的作者设计,以获取构建类似工具的访问权限。

【讨论】:

  • 添加一个返回新表单的类方法也可以。也许会为某人指明正确的方向。
  • 有没有人参与并愿意分享?
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 2017-10-07
  • 2015-04-07
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
相关资源
最近更新 更多