自定义 Flask-Admin 表单,其中一些选择字段选项根据另一个选择字段设置

2024-04-19

我正在尝试使用 Flask-Admin 为下面所示的模型 Matriline 创建一个创建/编辑表单。该模型有一个字符串字段 name 和一个字段 pod_id,该字段具有对另一个模型 Pod 的外键约束,该模型本身也有一个外键字段氏族模型。

Flask-Admin 创建的默认表单显示 name 字段和 Pod 实例的选择字段,但我想添加一个字段 Clan,这将根据所选的Clan实例重置Pod列表。

为了添加 Clan 字段,我覆盖了 Matriline 的默认 ModelView,并添加了一个包含所有 Clan 实例的额外选择字段 Clan,如请查看下面的母系视图。

现在,我需要向呈现的表单添加一些 Ajax 代码,以便在每次选择新部落时重置 Pod 列表。

我是否必须用包含 Ajax 代码的自定义表单完全替换默认表单?或者有没有更简单的方法可以使用 Flask-Admin 来实现?

<b>models.py</b>

...

class Matriline(db.Model):
    __tablename__ = 'matriline'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    pod_id = db.Column(db.Integer, db.ForeignKey('pod.id'))

    def __unicode__(self):
        return self.name


class Pod(db.Model):
    __tablename__ = 'pod'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    matrilines = db.relationship('Matriline', backref='pod', lazy='select')
    clan_id = db.Column(db.Integer, db.ForeignKey('clan.id'))

    def __unicode__(self):
        return self.name


class Clan(db.Model):
    __tablename__ = 'clan'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    pods = db.relationship('Pod', backref='clan', lazy='select')

    def __unicode__(self):
        return self.name

...

<b>views.py</b>

from flask_admin.contrib import sqla
from wtforms import SelectField
from orcall import models


class MatrilineView(sqla.ModelView):
    column_hide_backrefs = False
    form_extra_fields = {
        'clan': SelectField('Clan',
            choices=[ (c.id, c.name) for c in models.Clan.query.all()])
    }
    column_list = ('name', 'pod', 'clan')

...

你需要使用一个查询选择字段。例如:

from flask.ext.admin.form import Select2Widget

class MatrilineView(sqla.ModelView):
    column_hide_backrefs = False
    form_extra_fields = {
        'clan': sqla.fields.QuerySelectField(
            label='Clan',
            query_factory=lambda: Clan.query.all(),
            widget=Select2Widget()
        )
    }
    column_list = ('name', 'pod', 'clan')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 Flask-Admin 表单,其中一些选择字段选项根据另一个选择字段设置 的相关文章

随机推荐