假设我有这个模型:
class Scenario(db.Document):
name = db.StringField()
meta = {'allow_inheritance': True}
class VentilationScenario(Scenario):
outflow = ...
class OccupancyScenario(Scenario):
density = ...
我想创建一个表单来编辑这个模型的实例。此表单将有一个选择字段来选择子类。
添加类型字段
我所做的是添加一个类型字段:
class Scenario(db.Document):
types = ((ventilation, 'Ventilation'), (occupancy, 'Occupancy'))
default_type = 'ventilation'
name = db.StringField()
scen_type = db.StringField(db_field="type",
choices=types, default=default_type)
meta = {'allow_inheritance': True}
class VentilationScenario(Scenario):
outflow = ...
class OccupancyScenario(Scenario):
density = ...
这个scen_type
字段有点多余,因为类型信息已经包含在_cls
添加的属性 MongoEngine 中。
使用现有的 _cls 元素
我还注意到field_dict
返回的 bymodel_fields
确实有一个_cls
元素,但我不知道如何使用它。
在 中field_dict
,所有字段都是<UnboundField...>
_cls
是这样的<UnboundField(TextAreaField, (), {'default': None, 'description': '', 'validators': [<wtforms.validators.Optional object at 0x7fe3c983cb00>], 'label': '_cls', 'filters': []})>
但是,当我实例化表单时,name
它是“绑定的”(我猜)并form.name
返回预期的 html,而_cls
仍然是未绑定的。
这些方法中的任何一种是否“推荐”?
到目前为止,类型字段方法一直在工作,但是在处理嵌入式文档中的继承时它变得复杂,我觉得我可能缺少烧瓶 mongoengine 功能,如果不是头疼的话,这些功能可能会为我节省一些工作。
或者,也许我对这种烧瓶-mongoengine wtforms 集成期望过高,我应该手动做很多事情。
如果有意义,我不介意调整flask-mongoengine 并提交我的更改,但我希望能得到一些反馈,以确保我走在正确的轨道上。
附属问题:假设_cls
表格中不应该用于此,它是做什么用的?它是否以表格形式结束,因为它恰好在模型中,但不打算在那里使用?它在表单实例中有什么用吗?