23

假设我们有一个模型 Foo,它引用了另一个模型 User - 和 Flask-Admin 视图。

在 Foo 管理视图页面(例如,类似于http://mrjoes.github.io/2012/08/27/flask-admin-102.html的第一个屏幕截图),我希望 User 列中的条目是链接到相应的用户模型视图。

我是否需要修改 Flask-Admin 的模板之一来实现这一点?

(这可以在 Django 管理界面中通过简单地输出给定字段的 HTML 并设置allow_tags (ref) True 来绕过 Django 的 HTML 标记过滤器)

4

4 回答 4

36

一些基于乔斯回答的示例代码:

class MyFooView(ModelView):

    def _user_formatter(view, context, model, name):
        return Markup(
            u"<a href='%s'>%s</a>" % (
                url_for('user.edit_view', id=model.user.id),
                model.user
            )
        ) if model.user else u""

    column_formatters = {
        'user': _user_formatter
    }
于 2013-06-19T12:25:29.503 回答
24

用于column_formatters此:https ://flask-admin.readthedocs.org/en/latest/api/mod_model/#flask.ext.admin.model.BaseModelView.column_formatters

想法很简单:对于要显示为超链接的字段,要么生成一个 HTML 字符串并用 Jinja2Markup类包装它(因此它不会在模板中转义)或使用macro帮助器:https ://github.com/ mrjoes/flask-admin/blob/master/flask_admin/model/template.py

宏助手允许您在覆盖的模板中使用自定义 Jinja2 宏,这将表示逻辑移动到模板。

就 URL 而言,您只需找到为User模型生成(或提供)的端点名称并url_for('userview.edit_view', id=model.id)生成链接。

于 2013-06-19T06:28:40.603 回答
0

@wodow 的额外信息,注意model.user如果你使用 pymongo 作为后端是错误的,因为 pymongo 中的模型是一个 dict 类型,你可以用model['name']它来替换它

于 2016-12-20T03:38:36.157 回答
-1

将此代码添加到已被其他模型引用的每个模型中,flask-admin 和 jinja 将处理您要在屏幕上显示的名称,只需将其替换为您喜欢的任何名称:

def __unicode__(self):
    return self.name  # or self.id or whatever you prefer

例如:

class Role(db.Document, RoleMixin):
    name = db.StringField(max_length=80, unique=True)
    description = db.StringField(max_length=255)

    def __unicode__(self):
        return self.name

class MasterUser(db.Document, UserMixin):
    email = db.StringField(max_length=255)
    password = db.StringField(max_length=255)
    active = db.BooleanField(default=True)
    confirmed_at = db.DateTimeField()
    roles = db.ListField(db.ReferenceField(Role), default=[])
于 2019-03-14T17:47:33.447 回答