2013-06-18 8 views
20

Załóżmy, że mamy model, Foo, który odwołuje się do widoków dla obu modeli, User - i Flask-Admin.Czy można modelować widoki w hiperłączu Flask-Admin do innych widoków modelu?

Na stronie widoku administracyjnego Foo (np. Coś takiego jak pierwszy zrzut ekranu pod adresem http://mrjoes.github.io/2012/08/27/flask-admin-102.html), chciałbym, żeby wpisy w kolumnie Użytkownik były łączami do odpowiedniego widoku Modelu użytkownika.

Czy muszę zmodyfikować jeden z szablonów Flask-Admin, aby to osiągnąć?

(Jest to możliwe w interfejsie administracyjnym Django po prostu wyprowadzania HTML dla danego pola i ustawienie allow_tags(ref) wierny ominąć filtr tag HTML Django)

Odpowiedz

23

Zastosowanie column_formatters na to: https://flask-admin.readthedocs.org/en/latest/api/mod_model/#flask.ext.admin.model.BaseModelView.column_formatters

Idea jest dość proste: dla pola, które chcesz wyświetlić jako hiperłącze, wygeneruj ciąg znaków HTML i zawiń go klasą Jinja2 Markup (aby szablon nie został zmieniony) lub użyj pomocnika macro: https://github.com/mrjoes/flask-admin/blob/master/flask_admin/model/template.py

Pomocnik makro pozwala na użycie niestandardowych makr Jinja2 w zastąpionym szablonie, który przenosi logikę prezentacji do szablonów.

Jeśli chodzi o adres URL, wystarczy wyszukać nazwę punktu końcowego wygenerowaną (lub dostarczoną) dla modelu User i wykonać url_for('userview.edit_view', id=model.id) w celu wygenerowania łącza.

+1

Działa świetnie - dziękuję. Brakujący link dla mnie był przy użyciu jinja2.Markup. – wodow

32

Niektóre przykładowy kod na podstawie odpowiedzi 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 
    } 
+0

Świetny przykład! W moim przypadku nie potrzebowałem adresu url_for, ponieważ były to linki zewnętrzne, ale świetne niezależnie. –

0

dodatkowych informacji o @wodow zauważyć, że model.user jest źle, jeśli używasz pymongo jako backend, ponieważ model w pymongo jest rodzajem DICT, ty może po prostu użyć model['name'], aby go zastąpić.

Powiązane problemy