71 votes

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 des modèles, je veux une colonne personnalisée qui sera un hyperlien utilisant une des valeurs des champs. En fait, l'un des champs du modèle est une URL et je voudrais que la colonne contienne cette URL dans un hyperlien cliquable. Ce lien devra être précédé d'une URL supplémentaire car il s'agit d'un chemin relatif dans le champ du modèle.

1 votes

87voto

drmegahertz Points 1324

Définissez une méthode dans votre classe ModelAdmin et définissez son paramètre allow_tags à l'attribut True . Cela permettra à la méthode de renvoyer du HTML non encodé à afficher dans la colonne.

Puis l'inscrire 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 de ModelAdmin.list_display pour plus de détails.

0 votes

J'ai découvert l'autre jour que vous n'avez en fait pas besoin du a car Django admin transformera automatiquement l'URL en lien hypertexte. Mais je ne suis pas sur mon PC de travail, donc je peux me tromper. Dans mon cas, je n'ai pas eu besoin de définir le paramètre allow_tags . J'ai également créé un get_url() sur mon modèle, par opposition à mon modèle d'administration - mais c'est assez trivial. Cependant, votre méthode est la meilleure si nous voulons ouvrir le lien dans une nouvelle fenêtre avec target=_blank -- J'espère que cela vous sera utile.

0 votes

@JRodDynamite Ceci n'est plus valable pour les dernières versions de django. Pourriez-vous ajouter la version de Django sur laquelle cela fonctionne ? Merci

0 votes

Voici un post pour la solution actualisée : stackoverflow.com/a/50989257/1331671

43voto

Seppo Erviälä Points 619

Utilisez le format_html utilitaire. Il échappe tout le html des paramètres et marque la chaîne de caractères comme sûre pour l'utilisation dans les modèles. Le site allow_tags a été déprécié dans Django 1.9.

from django.utils.html import format_html
from django.contrib import admin
from django.utils.translation import gettext_lazy as _

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

    @admin.display(description=_("Column title"))
    def show_url(self, obj):
        return format_html("<a href='http://pre.com{0}'>{0}</a>", obj.url)

Désormais, les utilisateurs de l'administration sont en sécurité même dans le cas où :

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

Véase la documentation pour plus d'informations.

1voto

Alex Winkler Points 363

J'utilise "instance" au lieu de "obj". C'est la réponse de Seppo Erviälä qui m'a le plus aidé car j'utilise Django 3.0.1.

def get_facebook(self, instance):
    return format_html("<a target='_blank' href='{0}'>{0}</a>", instance.profile.facebook)
get_facebook.short_description = 'Facebook'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X