【问题标题】:Custom Flask-Admin form with some select field choices set according to another select field自定义 Flask-Admin 表单,其中一些选择字段选项根据另一个选择字段设置
【发布时间】:2015-08-01 17:37:31
【问题描述】:

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

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

要添加 Clan 字段,我会覆盖 Matriline 的默认 ModelView 并添加一个带有所有 Clan 实例的额外选择字段 Clan,如显示在下面的视图 MatrilineView 中。

现在我需要在渲染的表单中添加一些 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')

...

【问题讨论】:

    标签: flask flask-admin


    【解决方案1】:

    您需要使用 QuerySelectField。例如:

    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')
    

    【讨论】:

    • Clan.query.all 应该是 Clan.query.all() 才能在 flask-admin 1.4.0 上工作
    • 您的解决方案对我来说工作正常,但是我使用 SelectField 并在使用此查询字段时添加了 onchange没有价值观或改变任何想法
    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多