77 votes

Comment puis-je générer du code HTML dans un message dans la nouvelle structure de messages Django?

Je suis en train d'afficher un peu de code html dans un message affiché par le nouveau Django messages de cadre. Plus précisément, je suis en train de faire cela via le ModelAdmin.message_user méthode, qui est juste un wrapper mince autour des messages():

def message_user(self, request, message):
    """
    Send a message to the user. The default implementation
    posts a message using the django.contrib.messages backend.
    """
    messages.info(request, message)

Tout ce que j'ai essayé jusqu'à présent semble affichage HTML d'échappement.

self.message_user(request, "<a href=\"http://www.google.com\">Here's google!</a>")

Ne fonctionne pas, ni n':

from django.utils.safestring import mark_safe
...
self.message_user(request, mark_safe("<a href=\"http://www.google.com\">Here's google!</a>"))

L'affichage du code du modèle dans l'admin base.html le modèle est assez simple:

    {% if messages %}
    <ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>
    {% endif %}

Donc je ne suis pas exactement sûr de ce que je fais de mal.

Des pensées ou des conseils grandement apprécié, merci!

99voto

DavidWinterbottom Points 2632

Une autre option consiste à utiliser extra_tags mot clé arg pour indiquer qu'un message est en sécurité. Par exemple

 messages.error(request, 'Here is a <a href="http://stackoverflow.com/">link</a>', extra_tags='safe')
 

puis utilisez la logique de modèle pour utiliser le filtre sécurisé

 {% for message in messages %}
    <li class="{{ message.tags }}">
    {% if 'safe' in message.tags %}{{ message|safe }}{% else %}{{ message }}{% endif %}
    </li>
{% endfor %}
 

27voto

jphalip Points 156

Comme indiqué dans le ticket Django suivant, cela devrait fonctionner si vous utilisez mark_safe () en combinaison avec le backend SessionStorage: https://code.djangoproject.com/ticket/14976#comment:9

17voto

Danny Roberts Points 1325

Avez-vous essayé {{ message | safe }} ?

Dans le modèle de modèle Django, les variables de modèle sont toujours protégées, sauf si vous les spécifiez comme étant sûres avec le filtre safe . Ce défaut protège même l’ignorant contre une attaque par injection.

Je ne sais pas comment cela interagit avec mark_safe, mais peut-être que quelque chose s'est passé entre les deux qui l'a rendu dangereux à nouveau.

0voto

Larry Points 1

Je cherchais un moyen d'utiliser du code HTML non échappé dans une liste d'administrateur. Je ne sais pas si cela s'applique au cadre des messages, mais utiliser allow_tags comme décrit ici m'a aidé.

http://urlencode.blogspot.com/2009/10/neat-django-admin-tricks-part-1.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X