6 votes

Comment envoyer un message de session à un utilisateur anonyme dans un site Django ?

J'affiche souvent des messages sur les actions de l'utilisateur aux utilisateurs connectés dans les vues de mon application Django en utilisant :

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

Comment puis-je faire la même chose pour les utilisateurs anonymes (non connectés) ? Il n'y a pas de request.user pour les utilisateurs anonymes, mais la documentation de Django indique qu'en utilisant l'intergiciel "session" vous pouvez faire la même chose que le code ci-dessus. La documentation de Django qui renvoie à l'intergiciel de session affirme que c'est possible, mais je n'ai pas trouvé comment le faire dans la documentation de session.

7voto

Paolo Bergantino Points 199336

C'est ce que je fais, en utilisant des processeurs contextuels :

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 au 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 ce qu'elle renvoie sera ajouté au contexte du modèle. Ainsi, si je souhaite envoyer un message à un utilisateur, je peux procéder de la manière suivante :

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

Enfin, dans un modèle, 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 juste utilisé pour le style en fonction de ce qu'il est ("erreur", "avis", "succès") et de la façon dont il est configuré, vous ne pouvez ajouter qu'un seul message à la fois pour un utilisateur, mais c'est tout ce dont j'ai vraiment besoin, donc cela fonctionne pour moi. Il pourrait être facilement modifié pour permettre l'ajout de plusieurs messages et ainsi de suite.

4voto

Daniel Naab Points 9857

Stocker les données directement dans la session, qui est un objet de type dictaphone. 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 pourriez également créer une classe intermédiaire pour vérifier l'objet de session à chaque demande, et procéder à la construction et à l'arrachage à ce niveau.

4voto

zgoda Points 8549

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

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

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