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.

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 %}

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.


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.


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

30

Use autoescapepara desativar o escape de HTML:

{% autoescape off %}{{ message }}{% endautoescape %}


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.