根据另一个 select 字段设置了一些 select 字段选项的自定义 Flask-Admin 表单
Custom Flask-Admin form with some select field choices set according to another select field
我正在尝试使用 Flask-Admin 为模型 Matriline 创建一个 create/edit 表单,如下所示。这个模型有一个字符串字段 name 和一个字段 pod_id 与另一个模型的外键约束 Pod,它本身有一个 Clan 模型的外键字段。
Flask-Admin 创建的默认表单显示 name 字段和 Pod 实例的 select 字段,但我想添加一个字段 Clan,它将根据 Clan 重置 Pod 列表实例 selected.
为了添加 Clan 字段,我覆盖了 Matriline 的默认 ModelView 并添加了一个额外的 select 字段 Clan 包含所有 Clan 实例,如下面的 MatrilineView 视图所示。
现在,我需要在呈现的表单中添加一些 Ajax 代码,以便在每次 select 编辑新氏族时重置 pods 的列表。
我是否必须将默认表单完全替换为包含 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')
...
您需要使用 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')
我正在尝试使用 Flask-Admin 为模型 Matriline 创建一个 create/edit 表单,如下所示。这个模型有一个字符串字段 name 和一个字段 pod_id 与另一个模型的外键约束 Pod,它本身有一个 Clan 模型的外键字段。
Flask-Admin 创建的默认表单显示 name 字段和 Pod 实例的 select 字段,但我想添加一个字段 Clan,它将根据 Clan 重置 Pod 列表实例 selected.
为了添加 Clan 字段,我覆盖了 Matriline 的默认 ModelView 并添加了一个额外的 select 字段 Clan 包含所有 Clan 实例,如下面的 MatrilineView 视图所示。
现在,我需要在呈现的表单中添加一些 Ajax 代码,以便在每次 select 编辑新氏族时重置 pods 的列表。
我是否必须将默认表单完全替换为包含 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')
...
您需要使用 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')