2009-07-06 7 views
3

J'affiche des messages utilisateur à l'aide de modèles utilisant RequestContext dans Django, qui permet d'accéder aux messages des utilisateurs via la variable template {{messages}}, ce qui est pratique.Gestion non destructive des messages utilisateur Django

J'aimerais l'utilisateur lui-même supprimer les messages - est-il un moyen de le faire dans Django sans réécrire beaucoup de code? Malheureusement Django supprime automatiquement les messages à chaque requête - pas très utile dans ce cas.

Django doc dit:

"Note that RequestContext calls get_and_delete_messages() behind the scenes" 

serait parfait s'il y avait un moyen de simplement désactiver la suppression automatique des messages!


REMARQUE: Malheureusement solution ci-dessous fait interface d'administration inutilisable. Je ne sais pas comment contourner cela, vraiment ennuyeux.

EDIT - a trouvé une solution - utilise un processeur de contexte d'authentification personnalisé qui appelle user.message_set.all() comme suggéré par Alex Martelli. Il n'est pas nécessaire de changer le code d'application du tout avec cette solution. (Processeur de contexte est un composant dans django qui injecte des variables dans les modèles.)

créer le fichier myapp/context_processors.py

et remplacer dans settings.py dans TEMPLATE_CONTEXT_PROCESSORS tuple django.core.context_processors.auth avec myapp.context_processors.auth_processor

mis dans myapp/context_processors.py:

def auth_processor(request): 
    """ 
    this function is mostly copy-pasted from django.core.context_processors.auth 
    it does everything the same way except keeps the messages 
    """ 
    messages = None 
    if hasattr(request, 'user'): 
     user = request.user 
     if user.is_authenticated(): 
      messages = user.message_set.all() 
    else: 
     from django.contrib.auth.models import AnonymousUser 
     user = AnonymousUser() 
    from django.core.context_processors import PermWrapper 
    return { 
     'user': user, 
     'messages': messages, 
     'perms': PermWrapper(user), 
    } 
+0

Y at-il une raison pour laquelle vous le feriez vouloir conserver le jeu de messages. Il est destiné à afficher le message à l'utilisateur; et une fois cela fait, il sera supprimé. –

+0

@becomingGuru Je veux que l'utilisateur sache reconnaître les messages importants. on leur dit qu'ils doivent valider le courrier électronique avant que leur contribution puisse être publiée. Ils peuvent toujours cliquer sur la petite boîte croisée pour fermer définitivement le message. – Evgeny

Répondre

3

Je sais que cela ressemble à une approche étrange, mais vous pouvez ajouter dans votre liste

request.user.message_set.all() 

avant instanciation RequestContext, puis les remettre dans ..

+0

Alex, merci. Je pense que j'ai trouvé une bonne solution - je l'ai affichée comme mise à jour dans ma question. – Evgeny

+0

Ah oui, excellent "packaging" de cette idée, merci @Evgeny. –

Questions connexes