Comment ajouter une colonne personnalisée avec un lien hypertexte dans l'interface d'administration de django?

J'ai une interface d'administration django et dans la liste du modèle, je veux une colonne personnalisée qui sera un lien hypertexte en utilisant l'une des valeurs de champs. Fondamentalement, l'un des champs des modèles est une url et j'aimerais que la colonne ait cette URL dans un lien hypertexte cliquable. Ce lien devra avoir une URL supplémentaire ajoutée en tant que chemin relatif dans le champ du modèle.

50
demandé sur dusan 2010-01-28 19:33:25

2 réponses

Définissez une méthode dans votre classe ModelAdmin et définissez son attribut allow_tags sur True. Cela permettra à la méthode de retourner le HTML Non échappé pour l'affichage dans la colonne.

Ensuite, listez-le comme une entrée dans ModelAdmin.attribut 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 de ModelAdmin.list_display pour plus de détails.

67
répondu JRodDynamite 2016-05-16 06:43:46

Utilisez l'utilitaire format_html. Cela échappera à tout html des paramètres et marquera la chaîne comme sûre à utiliser dans les modèles. L'attribut de méthode allow_tags a été obsolète 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 la documentation pour plus d'info.

14
répondu Seppo Erviälä 2016-09-09 14:59:17