Rendu d'une variable de modèle au format HTML

186

J'utilise l'interface 'messages' pour transmettre des messages à l'utilisateur comme ceci:

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

Je voudrais inclure du html dans ma {{ message }}variable et le rendre sans échapper au balisage dans le modèle.

xpanta
la source

Réponses:

333

Si vous ne voulez pas que le HTML soit échappé, regardez le safefiltre et la autoescapebalise:

safe:

{{ myhtml |safe }}

autoescape:

{% autoescape off %}
    {{ myhtml }}
{% endautoescape %}
Yuji 'Tomita' Tomita
la source
Si vous avez besoin d'afficher par exemple des signes monétaires comme l'euro ( €), le dollar passé de la vue, c'est la voie à suivre.
andilabs
Notez que c'est autoescape offet non on. J'ai fait cette erreur et je ne l'ai découvert que plus tard.
Anupam
37

Si vous voulez faire quelque chose de plus compliqué avec votre texte, vous pouvez créer votre propre filtre et faire de la magie avant de renvoyer le html. Avec un fichier templatag ressemblant à ceci:

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)

Ensuite, vous pouvez l'ajouter dans votre fichier de modèle

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

Et cela vous donnerait un beau résultat.

Goose Ninja
la source
30

Vous pouvez rendre un modèle dans votre code comme ceci:

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

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

Consultez la documentation Django pour plus d'informations.

Marcus Whybrow
la source
Je pense que j'ai eu le mauvais côté du bâton ici, mais je laisse la réponse pour le moment.
Marcus Whybrow
30

Utilisez autoescapepour désactiver l'échappement HTML:

{% autoescape off %}{{ message }}{% endautoescape %}
mipadi
la source