【问题标题】:Django Context Processors: Is it possible to access current context in ContextProcessor?Django 上下文处理器:是否可以在 ContextProcessor 中访问当前上下文?
【发布时间】:2011-04-20 12:39:16
【问题描述】:

有没有一种方法可以访问自定义上下文处理器中视图传递的当前上下文,以便我可以根据需要添加缺少的变量而不是覆盖现有变量?

我想要实现的目标:

我像这样 /city_slug/ 构建我的 URL,我想检查城市变量是否已经存在于上下文中,否则我想将城市添加到我的上下文中(可能使用存储在会话变量中的最后使用的城市,否则默认为一些城市,甚至可以设置会话变量以供下次使用。)

我认为这是一个很常见的问题,你们是如何解决的?

【问题讨论】:

    标签: django django-urls django-context


    【解决方案1】:

    您无法从上下文处理器中访问当前上下文,而且我想中间件也不是适合您的解决方案。也许创建您自己在视图中使用的模板渲染函数是有意义的,并且您总是将上下文和当前请求传递给它,并将您想要的功能放入其中并在最后使用通常的渲染函数 django 渲染模板为您提供!

    【讨论】:

      【解决方案2】:

      您可以使用 TemplateResponse 和 TemplateResponse middleware 来实现此目的。

      【讨论】:

      • 这很好,但似乎只有在视图以某种方式构造并返回TemplateResponse 时才有效。不幸的是,shortcuts.render_to_response 会返回 HttpResponse,即使它呈现模板,所以这不是最强大的解决方案(例如,如果您正在编写 Django 库)。所以图书馆作者:坚持使用自定义模板标签。
      【解决方案3】:

      我不确定自定义模板上下文处理器是否可以做到这一点。来自documentation

      上下文处理器有一个非常简单的接口:它只是一个 Python 函数,它接受一个参数,一个 HttpRequest 对象,并返回一个字典,该字典添加到模板中语境。每个上下文处理器都必须返回一个字典。

      (强调我的)。

      您应该考虑编写自定义中间件。如果有人知道制作上下文处理器的方法,我想知道。

      【讨论】:

        【解决方案4】:

        您不能使用 Django 上下文处理器执行此操作:它们只能访问请求对象,而不是其结果添加到的现有模板上下文。

        如果你想要的话,将城市存储在会话中听起来不错。模板将负责任何进一步的违约;如果您需要一些花哨的东西,您可能希望将其包装在可重复使用的 custom template tag 中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-25
          • 2016-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-27
          • 1970-01-01
          相关资源
          最近更新 更多