Renderowanie zmiennej szablonu jako HTML

186

Korzystam z interfejsu „wiadomości”, aby przekazywać wiadomości do użytkownika w następujący sposób:

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

Chciałbym dołączyć html do mojej {{ message }}zmiennej i renderować ją bez uciekania od znaczników w szablonie.

Xpanta
źródło

Odpowiedzi:

333

Jeśli nie chcesz, aby kod HTML był zmieniany, spójrz na safefiltr i autoescapeznacznik:

safe:

{{ myhtml |safe }}

autoescape:

{% autoescape off %}
    {{ myhtml }}
{% endautoescape %}
Yuji „Tomita” Tomita
źródło
Jeśli chcesz wyświetlać np. Znaki walutowe, takie jak euro ( €), dolara przeszedł z widoku, to jest właściwy sposób.
andilabs
Zauważ, że tak jest autoescape offi nie on. Popełniłem ten błąd i odkryłem go dopiero później.
Anupam
37

Jeśli chcesz zrobić coś bardziej skomplikowanego z tekstem, możesz utworzyć własny filtr i trochę magii przed zwróceniem html. Z plikiem szablonu wyglądającym tak:

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)

Następnie możesz dodać to do pliku szablonu

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

A to dałoby dobry wynik.

Goose Ninja
źródło
30

Możesz renderować szablon w kodzie w następujący sposób:

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

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

Więcej informacji można znaleźć w dokumentacji Django .

Marcus Whybrow
źródło
Myślę, że mam zły koniec kija tutaj, ale na razie zostawiam odpowiedź.
Marcus Whybrow
30

Użyj, autoescapeaby wyłączyć ucieczkę HTML:

{% autoescape off %}{{ message }}{% endautoescape %}
mipadi
źródło