可以在Flask-Admin超链接中将视图建模到其他模型视图吗?

时间:2013-06-18 16:59:31

标签: python flask

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

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

我是否需要修改Flask-Admin的模板之一才能实现此目的?

(这可以在Django管理界面中输入,只需输出给定字段的HTML并设置allow_tags (ref) True以绕过Django的HTML标记过滤器)

4 个答案:

答案 0 :(得分:35)

一些基于Joes答案的示例代码:

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
    }

答案 1 :(得分:24)

使用column_formattershttps://flask-admin.readthedocs.org/en/latest/api/mod_model/#flask.ext.admin.model.BaseModelView.column_formatters

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

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

就URL而言,您只需找到为macro模型生成(或提供)的端点名称,并User生成链接。

答案 2 :(得分:0)

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

答案 3 :(得分:-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=[])