Подтвердить что ты не робот

Можно ли моделировать представления в гиперссылке Flask-Admin на другие виды моделей?

Предположим, что у нас есть модель Foo, которая ссылается на другую модель, представления User и Flask-Admin для обоих.

На странице просмотра администратора Foo (например, что-то вроде первого снимка экрана в http://mrjoes.github.io/2012/08/27/flask-admin-102.html), я хотел бы, чтобы записи в столбце User были связаны с соответствующий вид модели пользователя.

Нужно ли мне модифицировать один из шаблонов Flask-Admin для этого?

(Это возможно в интерфейсе администратора Django, просто выведя HTML для данного поля и установив allow_tags (ref) Истина для обхода фильтра HTML-тегов Django)

4b9b3361

Ответ 1

Используйте column_formatters для этого: https://flask-admin.readthedocs.org/en/latest/api/mod_model/#flask.ext.admin.model.BaseModelView.column_formatters

Идея довольно проста: для поля, которое вы хотите отображать как гиперссылку, либо генерируйте HTML-строку, либо оберните ее классом Jinja2 Markup (чтобы она не удалялась в шаблонах) или используйте macro helper: https://github.com/mrjoes/flask-admin/blob/master/flask_admin/model/template.py

Вспомогательный макрос позволяет использовать пользовательские макросы Jinja2 в переопределенном шаблоне, который перемещает презентационную логику в шаблоны.

Что касается URL-адреса, все, что вам нужно, это найти имя конечной точки, сгенерированное (или предоставленное) для модели User, и сделать url_for('userview.edit_view', id=model.id) для создания ссылки.

Ответ 2

Пример кода, основанного на ответе Джоса:

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
    }

Ответ 3

дополнительная информация для @wodow, обратите внимание, что model.user неверно, если вы используете pymongo в качестве backend, потому что модель в pymongo является типом dict, вы можете просто использовать model['name'] для ее замены