Esto es lo que hago, utilizando procesadores de contexto:
project/application/context.py
(comprobar los mensajes y añadirlos al contexto):
def messages(request):
messages = {}
if 'message' in request.session:
message_type = request.session.get('message_type', 'error')
messages = {'message': request.session['message'],
'message_type': message_type}
del request.session['message']
if 'message_type' in request.session:
del request.session['message_type']
return messages
project/settings.py
(añadir el contexto de la TEMPLATE_CONTEXT_PROCESSORS
):
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
"django.core.context_processors.debug",
"django.core.context_processors.media",
"django.core.context_processors.auth",
"project.application.context.messages",
)
Con lo anterior se llamará a la función messages
en cada solicitud y lo que sea retu rns se agregarán al contexto de la plantilla. Con esto en su lugar, si quiero dar a un usuario un mensaje, yo puedo hacer esto:
def my_view(request):
if someCondition:
request.session['message'] = 'Some Error Message'
Por último, en una plantilla que sólo puede comprobar si hay errores que se visualizarán:
{% if message %}
<div id="system_message" class="{{ message_type }}">
{{ message }}
</div>
{% endif %}
El tipo de mensaje solo se usa para dar estilo dependiendo de lo que sea ("error", "aviso", "éxito") y la forma en que se configura esto solo puede agregar 1 mensaje a la vez para un usuario, pero eso es todo Realmente alguna vez lo necesito, así que funciona para mí. Se podría cambiar fácilmente para permitir múltiples mensajes y tal.
lamentablemente django_session_messages no funcionará con django.core.context_processors.auth, que borrará todos los mensajes de los usuarios antes de que se ejecute el código en este parche. Probablemente uno podría considerar volver a hacer todo el sistema de mensajes en django. – Evgeny
si invierte el orden de los dos procesadores de contexto en la configuración, el segundo sobrescribirá la lista de mensajes, por lo que tampoco ayudará. – Evgeny