2010-01-28 5 views
47

J'ai une interface d'administration django et dans la liste des modèles, je veux une colonne personnalisée qui sera un lien hypertexte en utilisant l'une des valeurs des champs. Fondamentalement, l'un des champs des modèles est une url et je voudrais que la colonne ait cette URL dans un lien hypertexte cliquable. Ce lien devra être précédé d'une URL supplémentaire comme étant un chemin relatif dans le champ du modèle.Comment ajouter une colonne personnalisée avec un lien hypertexte dans l'interface d'administration django?

+1

Copie possible de [Comment ajouter des liens cliquables à un champ dans l'admin Django?] (Http://stackoverflow.com/questions/1949248/how-to-add-clickable-links-to-a-field-in -django-admin) – Louis

Répondre

60

Définissez une méthode dans votre classe ModelAdmin et définissez son attribut allow_tags sur True. Cela permettra à la méthode de renvoyer le code HTML non échappé pour l'affichage dans la colonne. Puis ajoutez-le comme une entrée dans l'attribut ModelAdmin.list_display.

Exemple:

class YourModelAdmin(admin.ModelAdmin): 
    list_display = ('my_url_field',) 

    def my_url_field(self, obj): 
     return '<a href="%s%s">%s</a>' % ('http://url-to-prepend.com/', obj.url_field, obj.url_field) 
    my_url_field.allow_tags = True 
    my_url_field.short_description = 'Column description' 

Voir la documentation ModelAdmin.list_display pour plus de détails.

+0

J'ai découvert l'autre jour que vous n'avez pas vraiment besoin de la balise 'a', car Django admin transformera automatiquement l'URL en un lien hypertexte. Je ne suis pas sur mon PC de travail, donc je peux me tromper. Dans mon cas, je n'ai pas besoin de définir 'allow_tags'. J'ai également créé une fonction 'get_url()' sur mon modèle, par opposition à mon modèle d'administration - mais c'est assez trivial. Cependant, votre chemin est le meilleur si nous voulons ouvrir le lien dans une nouvelle fenêtre avec 'target = _blank' - Espérons que cela soit utile. –

10

Utilisez l'utilitaire format_html. Cela permettra d'échapper tout code HTML de paramètres et marquer la chaîne comme sûr à utiliser dans les modèles. L'attribut de méthode allow_tags a été abandonné dans Django 1.9.

from django.utils.html import format_html 

class MyModelAdmin(admin.ModelAdmin): 
    list_display = ['show_url', ...] 
    ... 

    def show_url(self, obj): 
     return format_html("<a href='http://pre.com{0}'>{0}</a>", obj.url) 

Maintenant vos utilisateurs admin sont en sécurité, même dans le cas de:

url == '<script>eval(...);</script>' 

Voir the documentation pour plus d'informations.

Questions connexes