【问题标题】:django middleware set user special global variabledjango 中间件设置用户特殊全局变量
【发布时间】:2010-11-14 15:13:41
【问题描述】:

如果每个网页都有用户新消息通知(新消息计数,如 message(1)),我如何将变量 '{ new_message_count: 1}' 传递给每个视图 我想使用中间件:

class page_variable():
def process_request(self, request):
    # put the variable to the request or response so can used in template variable
    return None

模板看起来像:

<a href="/message/">new <em>({{ new_message_count }})</em></a>

【问题讨论】:

    标签: django templates variables response middleware


    【解决方案1】:

    已经有一个内置的messaging framework 可以为您处理所有这些。

    但是,假设您真的想推出自己的产品,您不能将东西从中间件传递到上下文中。您可以将它附加到request 对象,然后您可以在视图或模板中使用它,或者添加一个上下文处理器,该处理器从请求中获取变量并将其添加到上下文中。

    【讨论】:

    • 是的!这就是我想要的,非常感谢,但是如何将它附加到请求中?我尝试“request.new_message_count = 1”或“request['new_message_count']=1”或“request.__class__.new_message_count=1”,但不起作用
    • 什么意思,它不起作用?第一个应该可以正常工作。
    • 我在 def process_request(self, request): 做,但是模板没有得到变量 {{ new_message_count }},我一定错过了一些东西。我会再试一次
    • 如果您已将变量附加到请求中,那么您当然需要以{{ request.new_message_count }} 访问它。
    • 嗨,我解决了这个问题。使用 context_processors,我误解了 context_processors 和中间件的用法,很容易写一个 context_processor 像 def message_statis(request): return { 'new_message_count': 1, } 并直接在模板中获取变量 {{ new_message_count }},谢谢 Daniel Roseman ,这是我在stackoverflow中的第一个问题
    【解决方案2】:

    在 django 的开发版本中,您可以在渲染之前从中间件编辑模板上下文:

    class MessageCountMiddleware:
        def process_template_response(self, request, response):
            response.context['new_message_count'] = message_count(request.user)
    

    在 Django 1.2 中,您可以创建自定义上下文处理器:

    def add_message_count(request):
        return { 'new_message_count': message_count(request.user) }
    

    并在设置中注册

    TEMPLATE_CONTEXT_PROCESSORS += [ 'my_project.content_processors.add_message_count' ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 2020-07-23
      相关资源
      最近更新 更多