2009-03-30 18 views
6

a menudo muestran mensajes acerca de las acciones del usuario a los usuarios registrados en mis puntos de vista de la aplicación de Django usando:¿Cómo enviar un mensaje de sesión a un usuario anónimo en un sitio de Django?

request.user.message_set.create("message to user") 

¿Cómo podría hacer lo mismo para el anonimato (no conectado) a los usuarios? No hay request.user para usuarios anónimos, pero la documentación de Django dice que usando el middleware "session" puede hacer lo mismo que el código anterior. La documentación de Django que enlaza con el middleware de la sesión afirma que es posible, pero no pude encontrar cómo hacerlo desde la documentación de la sesión.

Respuesta

4

Vea el http://code.google.com/p/django-session-messages/ hasta que el parche que habilite los mensajes basados ​​en sesión aterrice en el árbol de Django (como vi recientemente, está marcado para 1.2, por lo que no hay esperanza de una adición rápida ...).

Otro proyecto con funcionalidad similar es Django Flash (http://djangoflash.destaquenet.com/).

+0

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

+0

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

7

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.

Cuestiones relacionadas