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.

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

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.


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.


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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.