Как добавить интерактивные ссылки в поле администратора Django?
У меня есть admin.py
class LawyerAdmin(admin.ModelAdmin):
fieldsets = [
('Name', {'fields': ['last', 'first', 'firm_name', 'firm_url', 'school', 'year_graduated']}),
]
list_display = ('last', 'first', 'school', 'year_graduated', 'firm_name', 'firm_url')
list_filter = ['school', 'year_graduated']
search_fields = ['last', 'school', 'firm_name']
и я хочу, чтобы поля "firm_url" изменялись по каждому URL-адресу, указанному в поле. Как я могу это сделать? Спасибо.
Ответы
Ответ 1
Определите собственный метод в классе LawyerAdmin, который возвращает ссылку как HTML:
def show_firm_url(self, obj):
return '<a href="%s">%s</a>' % (obj.firm_url, obj.firm_url)
show_firm_url.allow_tags = True
Смотрите документацию.
Ответ 2
Используйте утилиту format_html
. Это позволит избежать любого html из параметров и пометить строку как безопасную для использования в шаблонах. Атрибут метода allow_tags
устарел в Django 1.9.
from django.utils.html import format_html
class LawyerAdmin(admin.ModelAdmin):
list_display = ['show_firm_url', ...]
...
def show_firm_url(self, obj):
return format_html("<a href='{url}'>{url}</a>", url=obj.firm_url)
show_firm_url.short_description = "Firm URL"
Теперь ваши пользователи admin безопасны даже в случае:
firm_url == 'http://a.aa/<script>eval(...);</script>'
Подробнее см. документацию.
Ответ 3
добавить show_firm_url
в list_display
Ответ 4
Но он переопределяет текстовый дисплей, указанный в моих моделях, и отображает "show firm url" в заголовке столбца
Вы можете изменить его, назначив свойство short_description:
show_firm_url.short_description = "Firm URL"
Ответ 5
Вы можете справиться с этим в модели, если вы предпочитаете:
В models.py:
class Foo(models.Model):
...
def full_url(self):
url = 'http://google.com'
from django.utils.html import format_html
return format_html("<a href='%s'>%s</a>" % (url, url))
admin.py:
list_display = ('full_url', ... )