89

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

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

我的设置文件看起来像这样

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")
4

5 回答 5

55

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

您确定您的视图正在被渲染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))
于 2010-05-23T22:23:58.110 回答
31

根据django 文档,您可以将render其用作快捷方式,而不是带有 context_instance 参数的 render_to_response :

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

于 2012-10-24T15:25:15.410 回答
10

从 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',
            ],
        },
    },
]

假设您的上下文处理器在应用程序wwwcontext_processors.py

于 2018-03-20T00:01:59.710 回答
8

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

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)将此添加到您的context_processors设置中settings.py(出于安全原因在底部)

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”模板变量。

快乐编码!

于 2021-02-04T18:43:48.123 回答
2

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

于 2015-02-11T07:36:56.113 回答