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 = ...

このフィールドは、追加された属性 MongoEnginescen_typeに型情報が既に含まれているため、冗長です。_cls

既存の _cls 要素の使用

field_dictまた、返された by に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 の wtforms の統合に期待しすぎているので、手作業で多くの作業を行う必要があります。

意味があれば、flask-mongoengine を微調整して変更を送信してもかまいませんが、正しい軌道に乗っていることを確認するために少しフィードバックをいただければ幸いです。

_cls補助的な質問:形式でこれに使用されるべきではないと仮定すると、それは何のためにここにあるのですか? たまたまモデルにあるが、そこで使用することを意図していないため、フォームになりますか? フォームインスタンスで使用できますか?

4

0 に答える 0