Rendering di una variabile modello come HTML


186

Uso l'interfaccia "messaggi" per passare messaggi all'utente in questo modo:

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

Vorrei includere HTML nella mia {{ message }}variabile e renderlo senza sfuggire al markup nel modello.

Risposte:


333

Se non desideri che l'HTML sia sottoposto a escape, osserva il safefiltro e il autoescapetag:

safe:

{{ myhtml |safe }}

autoescape:

{% autoescape off %}
    {{ myhtml }}
{% endautoescape %}

Se è necessario visualizzare, ad esempio, segni di valuta come euro ( €), il dollaro passato dalla vista è la strada da percorrere.
andilabs

Si noti che lo è autoescape offe non on. Ho fatto quell'errore e l'ho scoperto solo più tardi.
Anupam,

37

Se vuoi fare qualcosa di più complicato con il tuo testo, puoi creare il tuo filtro e fare un po 'di magia prima di restituire l'html. Con un file templatag simile a questo:

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)

Quindi è possibile aggiungere questo nel file modello

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

E questo ti darebbe un buon risultato.


30

Puoi rendere un modello nel tuo codice in questo modo:

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

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

Vedi i documenti Django per ulteriori informazioni.


Penso di aver ottenuto la parte sbagliata del bastone qui, ma per ora lascio la risposta.
Marcus Whybrow,

30

Usa il autoescapeper disattivare l'escaping HTML:

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.