pelicula - django wikipedia
¿Cómo envío HTML en un mensaje en el nuevo marco de mensajes de Django? (5)
Estoy tratando de mostrar un poco de html en un mensaje que se muestra a través del nuevo marco de mensajes de Django. Específicamente, estoy haciendo esto a través del método ModelAdmin.message_user, que es solo una envoltura delgada alrededor de los mensajes ():
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)
Todo lo que he intentado hasta ahora parece mostrar HTML escapado.
self.message_user(request, "<a href=/"http://www.google.com/">Here''s google!</a>")
No funciona, ni lo hace:
from django.utils.safestring import mark_safe
...
self.message_user(request, mark_safe("<a href=/"http://www.google.com/">Here''s google!</a>"))
La visualización del código de plantilla en la plantilla de administrador base.html es bastante sencilla:
{% if messages %}
<ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>
{% endif %}
Así que no estoy exactamente seguro de lo que estoy haciendo mal.
Pensamientos o guías muy apreciados, ¡gracias!
¿Has probado {{ message | safe }}
{{ message | safe }}
?
En la plantilla del sistema de Django, las variables de plantilla siempre se escapan, a menos que las especifique como seguras con el filtro safe
. Este valor predeterminado hace que incluso el no consciente esté protegido contra un ataque de inyección.
No estoy seguro de cómo eso interactúa con mark_safe, pero tal vez sucedió algo que lo hizo inseguro de nuevo.
Como se señala en el siguiente ticket de Django, debería funcionar si usa mark_safe () en combinación con el servidor de SessionStorage: https://code.djangoproject.com/ticket/14976#comment:9
Estaba buscando una forma de usar HTML sin guardar en una lista de administrador. No estoy seguro de si esto se aplica al marco de mensajes, pero el uso de allow_tags como se describe aquí me ayudó.
http://urlencode.blogspot.com/2009/10/neat-django-admin-tricks-part-1.html
Esto funcionó para mí (Django 1.11):
from django.contrib import messages
from django.utils.safestring import mark_safe
messages.info(request, mark_safe(''This is link to <a href="http://google.com">http://google.com</a>''))
Otra opción es usar la palabra clave extra_tags
arg para indicar que un mensaje es seguro. P.ej
messages.error(request, ''Here is a <a href="/">link</a>'', extra_tags=''safe'')
luego usa la lógica de la plantilla para usar el filtro seguro
{% for message in messages %}
<li class="{{ message.tags }}">
{% if ''safe'' in message.tags %}{{ message|safe }}{% else %}{{ message }}{% endif %}
</li>
{% endfor %}