2009-07-06 40 views
3

我使用Django中的RequestContext通過模板顯示用戶消息,它通過{{messages}}模板變量提供對用戶消息的訪問 - 這很方便。非破壞性地處理Django用戶消息

我想用戶他/她自己刪除郵件 - 有沒有辦法在Django中做到這一點,而不用重寫太多的代碼?不幸的是,Django會在每次請求時自動刪除消息 - 在這種情況下不是很有用。

Django的醫生說:

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

將是完美的,如果有一種方法來簡單地關閉郵件自動刪除!


注:不幸的是下面的解決方案,使管理界面無法使用。我不知道如何解決這個問題,真的很煩人。

編輯 - 找到一個解決方案 - 使用自定義身份驗證上下文處理器調用user.message_set.all()作爲亞歷克斯Martelli建議。使用此解決方案,根本不需要更改應用程序代碼。 (上下文處理器是在Django內噴射變量成模板的成分。)

創建文件的myapp/context_processors.py

和在settings.py django.core.context_processors.authmyapp.context_processors.auth_processor

替換 TEMPLATE_CONTEXT_PROCESSORS元組

放入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

是否有一個原因,你爲什麼會想保留消息集。它用於向用戶顯示消息;一旦完成,它將被刪除。 – 2009-07-07 06:53:07

+0

@becomingGuru我想讓肯定的用戶知道重要的信息。一個告訴他們,他們必須在他們的輸入可以發佈之前驗證電子郵件。他們仍然可以點擊小小的交叉框永久關閉該消息。 – Evgeny 2009-07-07 07:41:53

回答

3

我知道這聽起來像一個奇怪的方法,但你可以實例化的RequestContext之前複製到自己的列表

request.user.message_set.all() 

,後來將它們放回..