Можно ли моделировать представления в гиперссылке 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)
Ответы
Ответ 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']
для ее замены