我正在尝试使用Flask-Admin为下面显示的Matriline模型创建一个创建/编辑表单.此模型具有字符串字段名称和字段pod_id,其具有对另一个模型Pod的外键约束,其本身具有到Clan模型的外键字段.
Flask-Admin创建的默认表单显示了名称字段和Pod实例的选择字段,但我想添加一个字段Clan,它将根据所选的Clan实例重置Pod列表.
要添加Clan字段,我会覆盖Matriline的默认ModelView,并在所有Clan实例中添加一个额外的select字段Clan,如下面的MatrilineView视图所示.
现在我需要在渲染的表单中添加一些Ajax代码,以便在每次选择新的clan时重置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')
...
Run Code Online (Sandbox Code Playgroud)
您需要使用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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4479 次 |
| 最近记录: |