【问题标题】:creating my own context processor in django在 django 中创建我自己的上下文处理器
【发布时间】:2011-02-23 00:53:20
【问题描述】:

我已经到了需要将某些变量传递给我的所有视图(主要是自定义身份验证类型变量)的地步。

有人告诉我编写自己的上下文处理器是最好的方法,但我遇到了一些问题。

我的设置文件是这样的

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.contrib.messages.context_processors.messages",
    "sandbox.context_processors.say_hello", 
)

如您所见,我有一个名为“context_processors”的模块和一个名为“say_hello”的函数。

看起来像

def say_hello(request):
        return {
            'say_hello':"Hello",
        }

我是否可以假设我现在可以在我的观点范围内做以下事情?

{{ say_hello }}

现在,这在我的模板中没有呈现任何内容。

我的观点看起来像

from django.shortcuts import render_to_response

def test(request):
        return render_to_response("test.html")

【问题讨论】:

    标签: django views django-context


    【解决方案1】:

    您编写的上下文处理器应该可以工作。问题在你看来。

    您确定您的视图正在使用RequestContext 呈现吗?

    例如:

    def test_view(request):
        return render_to_response('template.html')
    

    上面的视图不会使用TEMPLATE_CONTEXT_PROCESSORS 中列出的上下文处理器。确保您提供 RequestContext,如下所示:

    def test_view(request):
        return render_to_response('template.html', context_instance=RequestContext(request))
    

    【讨论】:

    • 缺少的是“context_instance”!谢谢 TM
    • 跟进,我怎么需要这个context_instance?如果我使用 django 的身份验证系统,我怎么不需要这个?
    • Django 的内置视图会为您处理这个问题(它们使用RequestContext)。想想你制作的上下文处理器。它将request 作为参数。这意味着您需要以某种方式将当前请求提供给呈现逻辑。 RequestContext 基本上只是处理循环遍历所有上下文处理器并将当前请求传递给它们的简单逻辑,然后用结果更新页面上下文。
    • 我可以修改我的视图以请求上下文吗?
    • @TM。 return render_to_response('template.html', context_instance=RequestContext(request)) 是老式的,我认为return render(request,'template.html') 更干燥
    【解决方案2】:

    根据django docs,您可以使用render 作为快捷方式,而不是带有context_instance 参数的render_to_response:

    或者,使用 render() 快捷方式,这与使用强制使用 RequestContext 的 context_instance 参数调用 render_to_response() 相同。

    【讨论】:

    • 确实,现在这是可能的。
    【解决方案3】:

    如果您使用 Django 的 render_to_response() 快捷方式来使用字典的内容填充模板,则默认情况下您的模板将被传递一个 Context 实例(而不是 RequestContext)。要在模板渲染中使用RequestContext,请使用render() 快​​捷方式,这与使用context_instance 参数调用render_to_response() 相同,该参数强制使用RequestContext

    【讨论】:

      【解决方案4】:

      从 Django 1.8 开始,您可以像这样注册自定义上下文处理器:

      TEMPLATES = [
          {
              'BACKEND': 'django.template.backends.django.DjangoTemplates',
              'DIRS': [
                  'templates'
              ],
              'APP_DIRS': True,
              'OPTIONS': {
                  'context_processors': [
                      'django.template.context_processors.debug',
                      'django.template.context_processors.request',
                      'django.contrib.auth.context_processors.auth',
                      'django.contrib.messages.context_processors.messages',
                      'www.context_processors.instance',
                  ],
              },
          },
      ]
      

      假设您的上下文处理器位于应用程序 www in context_processors.py

      【讨论】:

        【解决方案5】:

        假设您有这样的文件结构:

        YourDjangoProject
        ├───project
        │   ├───__init__.py
        │   ├───asgi.py
        │   ├───settings.py
        │   ├───urls.py
        │   └───wsgi.py
        ├───.env
        ├───manage.py
        └───db.sqlite3
        

        1) 在任何地方,创建一个 context_processors.py 文件

        我将在项目文件夹中创建一个(带有 settings.py):

        YourDjangoProject
        └───project
            ├───...
            └───context_processors.py
        

        2) 在 context_processors.py 中创建一个函数,该函数接受一个 HttpRequest 对象作为参数并返回一个字典

        上下文处理器只是一个接受 HttpRequest 对象作为参数并返回字典的函数。

        像这样:

        # project/context_processors.py
        
        def site_email(request):
            return {'site_email': 'example@gmail.com'}
        

        3) 将此添加到您在settings.py 中的context_processors 设置(出于安全原因在底部)

        TEMPLATES = [
            {
                'BACKEND': 'django.template.backends.django.DjangoTemplates',
                'DIRS': [BASE_DIR / 'config' / 'templates'],
                'APP_DIRS': True,
                'OPTIONS': {
                    'context_processors': [
                        'django.template.context_processors.debug',
                        'django.template.context_processors.request',
                        'django.contrib.auth.context_processors.auth',
                        'django.contrib.messages.context_processors.messages',
                        'project.context_processors.site_email',  # <- New context processor here
                    ],
                },
            },
        ]
        

        现在您将能够访问整个站点中每个 django 模板上的“site_email”模板变量。

        编码愉快!

        【讨论】:

          猜你喜欢
          • 2014-02-04
          • 1970-01-01
          • 2016-07-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-09
          • 2015-11-27
          • 2018-02-04
          • 1970-01-01
          相关资源
          最近更新 更多