使用Django中的上下文处理器在视图中访问全局变量

时间:2011-10-15 16:38:03

标签: django django-views django-context

假设我有一个上下文处理器:

def title(request):
   return {'titles': 'mytitle'}

我可以在模板中访问此变量{{ titles }}

但我怎么能在视图中这样做?

def myview(request):
    print request.titles

似乎不起作用 - 'WSGIRequest' object has no attribute 'titles'


或许有更好的方法(比上下文处理器)可以在视图和模板中访问全局变量?

提前致谢。

3 个答案:

答案 0 :(得分:10)

将上下文处理器方法路径(folder.context_processor.application_context)添加到TEMPLATE_CONTEXT_PROCESSORS。

在我的情况下,application_context是我在文件context_processor.py中定义的方法 和方法“application_context”返回{'titles':'mytitle'}

如果您想在视图中使用“title”作为全局变量,请以这种方式使用它

global_var = RequestContext(request).get("app_config")
titles = global_var.get("titles")
print titles 

唯一的好处是“模板和视图中都可以看到相同的变量'标题'”

答案 1 :(得分:2)

上下文处理器绝不是全局变量。它们只是在启动RequestContext时运行的函数,它将项添加到该上下文。所以它们只有在你有RequestContext的地方才能使用,即在模板中。

您的示例并未真正了解您要访问的变量。如果它只是你想在任何地方使用的一些常量,一个好方法是将它们定义在中心位置,例如在settings.py中,并在任何需要的地方导入该模块 - 再使用上下文处理器将它们添加到上下文中。

答案 2 :(得分:1)

如果您需要视图中的数据,那么将中间件与上下文处理器结合使用会更清晰:

  1. 创建一个简单的自定义中间件,将一些数据存储在请求对象上,例如request.xexample)。现在,您可以直接在视图中访问它。
  2. django.core.context_processors.request中启用TEMPLATE_CONTEXT_PROCESSORS,以便从您的模板访问request.x.
  3. 请参阅我的相关问题:Django: How to provide context to all views (not templates)?