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.
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.
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.