非破坏性地处理Django用户消息

时间:2009-07-06 22:07:58

标签: django

我正在使用Django中的RequestContext通过模板显示用户消息,这样可以通过{{messages}}模板变量访问用户消息 - 这很方便。

我希望用户他/她自己删除消息 - 有没有办法在Django中执行此操作而无需重写多少代码?不幸的是,Django会在每次请求时自动删除消息 - 在这种情况下不是很有用。

Django doc说:

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

如果有办法简单地关闭自动删除消息,那将是完美的!


注意:不幸的是,下面的解决方案会使管理界面无法使用。我不知道怎么解决这个问题,真烦人。

编辑 - 找到解决方案 - 使用自定义身份验证上下文处理器,调用user.message_set.all(),如Alex Martelli建议的那样。使用此解决方案无需更改应用程序代码。 (上下文处理器是django中的一个组件,它将变量注入到模板中。)

创建文件myapp / context_processors.py

并在 TEMPLATE_CONTEXT_PROCESSORS 元组的settings.py中替换      使用 django.core.context_processors.auth

myapp.context_processors.auth_processor

放入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),
    }

1 个答案:

答案 0 :(得分:3)

我知道这听起来像是一种奇怪的方法,但你可以复制到你自己的列表中

request.user.message_set.all()

在实例化RequestContext之前,然后将它们放回..