Как не дать Django экранировать HTML в ModelAdmin

#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) , но она по-прежнему экранирует HTML

2. Я увеличил свой ответ, но странно, что mark_safe не сработал.

3. mark_safe подходит для ваших собственных представлений, но в django admin allow_tags это правильный подход.

4. Спасибо за совет. Не знал, что :/