说我有这个型号:
class Scenario(db.Document):
name = db.StringField()
meta = {'allow_inheritance': True}
class VentilationScenario(Scenario):
outflow = ...
class OccupancyScenario(Scenario):
density = ...
我想创建一个表单来编辑此模型的实例。此表单将有一个select字段来选择子类。
我所做的是添加一个类型字段:
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
字段有点多余,因为类型信息已包含在MongoEngine添加的_cls
属性中。
我还注意到field_dict
返回的model_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集成太多了,我应该手工做很多。
我不介意调整烧瓶 - 发动机并提交我的更改,如果它们有意义,但我会感激一些反馈,以确保我走在正确的轨道上。
辅助问题:假设表格中的_cls
不应该用于此,它的用途是什么?它是否以形式结束,因为它碰巧在模型中,但它并不打算在那里使用?它在表单实例中有用吗?