web-dev-qa-db-fra.com

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

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 utilisant l'une des valeurs des champs. Fondamentalement, l'un des champs des modèles est une URL et un i ' d comme la colonne pour avoir cette URL dans un lien hypertexte cliquable. Ce lien devra avoir une URL supplémentaire ajoutée à lui comme son chemin d'accès relatif dans le champ du modèle.

59
mikec

Définissez une méthode dans votre classe ModelAdmin et définissez son allow_tags attribut à True. Cela permettra à la méthode de renvoyer du code HTML non échappé pour affichage dans la colonne.

Ensuite, répertoriez-le en tant qu'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 de ModelAdmin.list_display pour plus de détails.

74
user257858

Utilisez le format_html utilitaire. Cela échappera à tout html des paramètres et marquera la chaîne comme sûre à utiliser dans les modèles. Le allow_tags L'attribut de méthode est 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 administrateurs sont en sécurité même dans le cas de:

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

Voir la documentation pour plus d'informations.

21
Seppo Erviälä