flask-mongoengine:生成选择字段以在表单中公开模型继承

时间:2016-02-10 14:14:16

标签: python mongoengine wtforms flask-mongoengine

说我有这个型号:

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属性中。

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

0 个答案:

没有答案