#python #django #django-admin
#python #django #django-admin
Вопрос:
У меня есть этот класс для настройки django.contrib.admin
для моей Stream
модели.
class StreamAdmin(admin.ModelAdmin):
def stream_title(instance):
return instance.info.title
def network_name(instance):
return '<img src="%s" />' % instance.network.image_url
fieldsets = (
(None, {
'fields' : ('name', 'network', 'score', 'custom_url')
}),
)
list_display = ('name', stream_title, network_name, 'online', 'score')
ordering = ('name', 'score')
Функция network_name возвращает HTML, но он экранирован. Как я могу это остановить?
Ответ №1:
Используйте allow_tags
.
def network_name(instance):
return '<img src="%s" />' % instance.network.image_url
network_name.allow_tags = True
Комментарии:
1. Начиная с django 1.9 allow_tags устарел, поэтому используйте
mark_safe()
format_html()
илиformat_html_join()
Ответ №2:
Вы можете использовать mark_safe:
from django.utils.safestring import mark_safe
class StreamAdmin(admin.ModelAdmin):
...
def network_name(instance):
return mark_safe('<img src="%s" />' % instance.network.image_url)
...
Попробуйте использовать безопасный фильтр в шаблоне или даже автоэскейп.
Используя тег autoescape, вы можете настроить блок следующим образом:
{% autoescape on %}
{{ model.network_name }}
{% endautoescape %}
<!-- or either -->
{{ model.network_name|safe }}
Комментарии:
1. Изменил мою строку на
return mark_safe('<img src="%s" />' % instance.network.image_url)
, но она по-прежнему экранирует HTML2. Я увеличил свой ответ, но странно, что mark_safe не сработал.
3.
mark_safe
подходит для ваших собственных представлений, но в django adminallow_tags
это правильный подход.4. Спасибо за совет. Не знал, что :/