Rendern einer Vorlagenvariablen als HTML

186

Ich benutze die 'Nachrichten'-Oberfläche, um Nachrichten wie folgt an den Benutzer weiterzuleiten:

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

Ich möchte HTML in meine {{ message }}Variable aufnehmen und rendern, ohne das Markup in der Vorlage zu umgehen.

xpanta
quelle

Antworten:

331

Wenn Sie nicht möchten, dass der HTML-Code maskiert wird, sehen Sie sich den safeFilter und das autoescapeTag an:

safe::

{{ myhtml |safe }}

autoescape::

{% autoescape off %}
    {{ myhtml }}
{% endautoescape %}
Yuji 'Tomita' Tomita
quelle
Wenn Sie z. B. Währungszeichen wie euro ( €) anzeigen müssen, ist dies der richtige Weg.
Andilabs
Beachten Sie, dass dies der Fall ist autoescape offund nicht on. Ich habe diesen Fehler gemacht und ihn erst später entdeckt.
Anupam
37

Wenn Sie etwas Komplizierteres mit Ihrem Text machen möchten, können Sie Ihren eigenen Filter erstellen und etwas Magie anwenden, bevor Sie den HTML-Code zurückgeben. Mit einer Templatag-Datei, die so aussieht:

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)

Dann können Sie dies in Ihre Vorlagendatei einfügen

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

Und das würde Ihnen ein schönes Ergebnis bringen.

Gans Ninja
quelle
30

Verwenden Sie die autoescape, um HTML-Escape zu deaktivieren:

{% autoescape off %}{{ message }}{% endautoescape %}
Mipadi
quelle
29

Sie können eine Vorlage in Ihrem Code folgendermaßen rendern:

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

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

Weitere Informationen finden Sie in den Django-Dokumenten .

Marcus Whybrow
quelle
Ich glaube, ich habe hier das falsche Ende des Stocks, aber ich lasse die Antwort vorerst.
Marcus Whybrow