【问题标题】:Accessing global variable in view using context processor in Django在 Django 中使用上下文处理器访问视图中的全局变量
【发布时间】:2011-10-15 16:38:02
【问题描述】:

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

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

我可以在模板中以{{ titles }} 的身份访问这个变量。

但是如何在视图中这样做呢?

def myview(request):
    print request.titles

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


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

提前致谢。

【问题讨论】:

    标签: django django-views django-context


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。以这种方式定义常量并使用上下文处理器将它们添加到上下文中是我想要的。
    【解决方案2】:

    将您的上下文处理器方法路径 (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 
    

    唯一的好处是“相同的变量‘titles’对于模板和你的视图都是可见的”

    【讨论】:

    • 本例中的"app_config" 是什么?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多