4

假设我有这个模型:

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表格中不应该用于此,它是做什么用的?它是否以表格形式结束,因为它恰好在模型中,但不打算在那里使用?它在表单实例中有什么用吗?

4

0 回答 0