代码之家  ›  专栏  ›  技术社区  ›  Chris B. Behrens

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

  •  3
  • Chris B. Behrens  · 技术社区  · 5 年前

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

    我想要一个用户 删除消息-有没有一种方法可以在Django中不重写太多代码的情况下删除消息?不幸的是,Django会在每次请求时自动删除消息——在这种情况下不是很有用。

    Django博士说:

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

    如果有一种方法可以简单地关闭自动删除消息,那将是完美的!


    不幸的是,下面的解决方案令人失望 . 我不知道该怎么处理这件事,真烦人。

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

    创建文件myapp/context_processors.py

    并在中的settings.py中替换 TEMPLATE_CONTEXT_PROCESSORS 元组 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 回复  |  直到 15 年前
        1
  •  3
  •   Alex Martelli    15 年前

    我知道这听起来很奇怪,但你可以复制到自己的列表中

    request.user.message_set.all()
    

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