Django Context处理器:是否可以在ContextProcessor中访问当前上下文?

时间:2010-10-03 17:14:23

标签: django django-urls django-context

有没有办法可以访问自定义上下文处理器中视图传递的当前上下文,这样我可以添加缺少的变量,如果我想要而不是覆盖现有变量?

我想要实现的目标:

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

我认为这是非常常见的问题,你们如何解决它?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我不确定自定义模板上下文处理器是否可以执行此操作。来自documentation

  

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

(强调我的)。

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

答案 3 :(得分:0)

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

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