我已经实现了一个类别功能,用于在简单的博客上对帖子进行排序,但Flask-Admin在创建/编辑页面的类别字段中显示查询对象表示。
我想在下拉菜单中显示每个类别的name
字段,而不是查询对象表示,即:
Cool Stuff
代替<Category 'Cool Stuff'>
我怀疑这可以通过使用ModelView上的form_args
属性指定标签名称来完成,例如:
form_args = dict(
category=dict(label=model.name)
)
但是,我不知道如何从ModelView类中访问模型。我找到了this answer,但它似乎是一个特定的而不是一般的解决方案,在我的案例中并不适用。
此外,source code表示该模型预计可用,但未指定如何访问该模型。
如何从ModelView中访问模型?如果这不可能,那么查询对象表示问题会有另一种解决方案吗?
编辑:
这是我到目前为止的代码:
models.py
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), index=True, unique=True)
content = db.Column(db.UnicodeText) # arbitrary/variable length string
slug = db.Column(db.String(64), index=True, unique=True)
img = db.Column(db.String(64)) # url of associated image file
date_created = db.Column(db.DateTime, default=db.func.current_timestamp())
date_modified = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp())
# Relationships
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), index=True, unique=True)
slug = db.Column(db.String(64), index=True, unique=True)
posts = db.relationship('Post', backref='category', lazy='dynamic')
projects = db.relationship('Project', backref='category', lazy='dynamic')
def __repr__(self):
return '<Category \'{}\'>'.format(self.name)
routes.py
class PostModelView(ProBlogModelView):
form_overrides = dict(content=CKTextAreaField)
form_excluded_columns = ['id', 'slug', 'date_created', 'date_modified', ]
form_args = dict(
title=dict(validators=[InputRequired()]),
content=dict(validators=[InputRequired()]),
img=dict(label="Image URL", validators=[InputRequired()]),
)
Flask-Admin似乎默认使用下拉菜单在Post模型的Edit和Create页面上显示现有类别集。该菜单中包含的选项应该是Category模型的每个实例的__repr__
值,而不是其name属性。我的目标是显示名称而不是__repr__
值。
我已经使用column_formatters
在Post管理区域的主列表中完成了此操作,但我还不清楚如何在编辑/创建页面表单中执行相同操作。