2009-03-30 6 views
6

Je montrent souvent des messages sur les actions des utilisateurs à utilisateurs connectés à mon point de vue d'applications Django en utilisant:Comment envoyer un message de session à un utilisateur anonyme sur un site Django?

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

Comment pourrais-je faire la même chose pour les utilisateurs anonymes (non connecté)? Il n'y a pas de request.user pour les utilisateurs anonymes, mais la documentation de Django indique qu'en utilisant le middleware "session", vous pouvez faire la même chose que le code ci-dessus. La documentation de Django liée au middleware de session prétend que c'est possible, mais je n'ai pas trouvé comment le faire à partir de la documentation de la session.

Répondre

4

Voir http://code.google.com/p/django-session-messages/ jusqu'à ce que le correctif qui permet aux messages basés sur la session atterrit dans l'arborescence Django (comme je l'ai vu récemment, il est marqué pour 1.2, donc pas d'espoir d'ajout rapide ...).

Un autre projet avec des fonctionnalités similaires est Django Flash (http://djangoflash.destaquenet.com/).

+0

Malheureusement, django_session_messages ne fonctionnera pas avec django.core.context_processors.auth qui supprime tous les messages utilisateur avant l'exécution du code dans ce patch. Probablement, on pourrait envisager de refaire tout le système de messagerie dans django. – Evgeny

+0

si vous inversez l'ordre des deux processeurs de contexte dans les paramètres, le second écrasera la liste des messages, donc cela ne vous aidera pas non plus. – Evgeny

4

Stockez les données directement dans la session, qui est un objet semblable à un dict. Ensuite, dans la vue/le modèle, vérifiez la valeur.

Plus d'informations ici:

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

Vous pouvez également créer une classe de middleware pour vérifier l'objet de la session sur chaque demande, et faites votre accumulation/déchirer là-bas.

7

C'est ce que je fais, en utilisant les processeurs de contexte:

project/application/context.py (vérifier les messages et les ajouter au contexte):

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 (ajouter le contexte à 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", 
) 

Avec ce qui précède, la fonction messages sera appelée à chaque demande et quoi que ce soit rns sera ajouté au contexte du template. Avec cela en place, si je veux donner à un utilisateur un message, je peux le faire:

def my_view(request): 
    if someCondition: 
     request.session['message'] = 'Some Error Message' 

Enfin, dans un modèle que vous pouvez simplement vérifier s'il y a des erreurs à afficher:

{% if message %} 
    <div id="system_message" class="{{ message_type }}"> 
     {{ message }} 
    </div> 
{% endif %} 

Le type de message est simplement utilisé pour le style en fonction de ce qu'il est ("erreur", "avis", "succès") et la façon dont cela est configuré vous pouvez seulement ajouter un message à la fois pour un utilisateur, mais c'est tout J'ai vraiment besoin de ça alors ça marche pour moi. Il pourrait être facilement modifié pour permettre plusieurs messages et autres.

Questions connexes