Renderizando uma variável de modelo como HTML

186

Eu uso a interface 'messages' para passar mensagens para o usuário assim:

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

Gostaria de incluir html na minha {{ message }}variável e renderizá-la sem escapar da marcação no modelo.

xpanta
fonte

Respostas:

333

Se você não deseja que o HTML seja escapado, observe o safefiltro e a autoescapetag:

safe:

{{ myhtml |safe }}

autoescape:

{% autoescape off %}
    {{ myhtml }}
{% endautoescape %}
Tomita, Yuji Tomita
fonte
Se você precisar exibir, por exemplo, sinais de moeda como euro ( €), dólar passado da vista, este é o caminho a percorrer.
21414 andilabs
Note que é autoescape offe não on. Cometi esse erro e o descobri apenas mais tarde.
Anupam
37

Se você quiser fazer algo mais complicado com o seu texto, crie seu próprio filtro e faça alguma mágica antes de retornar o html. Com um arquivo templatag parecido com este:

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)

Então você pode adicionar isso no seu arquivo de modelo

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

E isso lhe daria um bom resultado.

Goose Ninja
fonte
30

Você pode renderizar um modelo no seu código da seguinte forma:

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

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

Veja os documentos do Django para mais informações.

Marcus Whybrow
fonte
Acho que entendi errado, mas deixo a resposta por enquanto.
Marcus Whybrow
30

Use autoescapepara desativar o escape de HTML:

{% autoescape off %}{{ message }}{% endautoescape %}
mipadi
fonte