2011-10-15 16 views
4

访问使用上下文处理器鉴于全局变量假设我有一个上下文处理器:在Django

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

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

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

def myview(request): 
    print request.titles 

似乎并没有工作 - 'WSGIRequest' object has no attribute 'titles'


或者,也许有一个更好的方法(除上下文处理器)在两个视图和模板访问的全局变量?

在此先感谢。

回答

2

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

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

+1

非常感谢。以这种方式定义常量并使用上下文处理器将它们添加到上下文中是我所需要的。 – laszchamachla

7

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

在我的情况application_context

是我的文件context_processor.py 和方法“application_context”返回{“头衔”:“mytitle”}中定义的方法,如果你想使用“标题”作为全局变量

在视图中这样

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

使用它唯一的优势是“同一个变量‘标题’将是可见的模板,也可以在你的意见”

0

如果您需要在您的视图中的数据,它的清洁使用Middlewa结合重新使用上下文处理器:

  1. 创建自定义琐碎中间件一些数据存储在请求对象上,在说request.xexample)。现在你可以直接在你的视图中访问它。
  2. 在您的TEMPLATE_CONTEXT_PROCESSORS中启用django.core.context_processors.request以使request.x可以从您的模板访问。

见我相关的问题:Django: How to provide context to all views (not templates)?