Визуализация переменной шаблона в виде HTML

186

Я использую интерфейс 'messages' для передачи сообщений пользователю следующим образом:

request.user.message_set.create(message=message)

Я хотел бы включить html в мою {{ message }}переменную и визуализировать ее без экранирования в шаблоне.

xpanta
источник

Ответы:

333

Если вы не хотите экранировать HTML, посмотрите на safeфильтр и autoescapeтег:

safe:

{{ myhtml |safe }}

autoescape:

{% autoescape off %}
    {{ myhtml }}
{% endautoescape %}
Юджи "Томита" Томита
источник
Если вам нужно отобразить, например, знаки валюты, такие как евро ( €), доллар, пропущенный из поля зрения, это путь.
andilabs
Обратите внимание, что это так autoescape offи нет on. Я сделал эту ошибку и обнаружил ее только позже.
Анупам
37

Если вы хотите сделать что-то более сложное с вашим текстом, вы можете создать свой собственный фильтр и сделать немного магии, прежде чем возвращать HTML. С файлом templatag, похожим на это:

from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter
def do_something(title, content):

    something = '<h1>%s</h1><p>%s</p>' % (title, content)
    return mark_safe(something)

Тогда вы можете добавить это в свой файл шаблона

<body>
...
    {{ title|do_something:content }}
...
</body>

И это даст вам хороший результат.

Гусь ниндзя
источник
30

Вы можете отобразить шаблон в вашем коде так:

from django.template import Context, Template
t = Template('This is your <span>{{ message }}</span>.')

c = Context({'message': 'Your message'})
html = t.render(c)

Смотрите Django документы для получения дополнительной информации.

Маркус Уайброу
источник
Я думаю, что я получил неправильный конец палки здесь, но я оставляю ответ на данный момент.
Маркус Уайброу
30

Используйте, autoescapeчтобы отключить экранирование HTML:

{% autoescape off %}{{ message }}{% endautoescape %}
mipadi
источник
6

Нет необходимости использовать фильтр или тег в шаблоне. Просто используйте format_html () для перевода переменной в html, и Django автоматически отключит экранирование для вашей переменной.

format_html("<h1>Hello</h1>")

Проверьте здесь https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.html.format_html

Норвегия
источник