6

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

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

我可以在模板中以{{ titles }}.

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

def myview(request):
    print request.titles

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


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

提前致谢。

4

3 回答 3

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 

唯一的优点是“模板以及您的视图中都可以看到相同的变量'标题'”

于 2012-07-09T14:06:01.283 回答
4

上下文处理器绝不是全局变量。它们只是在启动 RequestContext 时运行的简单函数,它们将项目添加到该上下文中。因此,它们仅在您有 RequestContext 的地方可用,即在模板中。

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

于 2011-10-15T16:49:37.050 回答
1

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

  1. 创建一个简单的自定义中间件以将一些数据存储在请求对象上,例如request.x示例)。现在您可以直接在视图中访问它。
  2. django.core.context_processors.request在您的模板中启用TEMPLATE_CONTEXT_PROCESSORSrequest.x 。

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

于 2016-05-07T11:29:43.270 回答