У меня есть интерфейс администратора django, и в листинге модели я хочу создать собственный столбец, который будет гиперссылкой, используя одно из значений полей. В основном одно из полей моделей - это URL-адрес, и я бы хотел, чтобы столбец имел этот URL в интерактивной гиперссылке. Эта ссылка должна иметь дополнительный URL-адрес, добавленный к нему как относительный путь в поле модели.
Как добавить пользовательский столбец с гиперссылкой в интерфейс администратора django?
Ответ 1
Определите метод в вашем классе ModelAdmin и установите его атрибут allow_tags
в True
. Это позволит методу вернуть неэкранированный HTML для отображения в столбце.
Затем перечислите его как запись в атрибуте ModelAdmin.list_display.
Пример:
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'
Подробнее см. документацию для ModelAdmin.list_display.
Ответ 2
Используйте утилиту format_html
. Это позволит избежать любого html из параметров и пометить строку как безопасную для использования в шаблонах. Атрибут метода allow_tags
устарел в 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)
Теперь ваши пользователи admin безопасны даже в случае:
url == '<script>eval(...);</script>'
Подробнее см. документацию.