在Django中创建我自己的上下文处理器


81

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

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

我的设置文件如下所示

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

Answers:


54

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

您是否确定要使用渲染视图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))

1
缺少“ context_instance”!谢谢TM
dotty

跟进,我为什么需要这个context_instance?如果我使用django的身份验证系统,为什么不需要此功能?

1
Django的内置视图可为您处理此问题(它们使用RequestContext)。考虑一下您创建的上下文处理器。它request作为一个论点。这意味着您需要以某种方式将当前请求提供给渲染逻辑。RequestContext基本上,它只是处理循环所有上下文处理器并将当前请求传递给它们,然后用结果更新页面上下文的简单逻辑。
TM。

我可以修改视图以请求上下文吗?

3
@TM值。 return render_to_response('template.html', context_instance=RequestContext(request))是旧的时尚,我想return render(request,'template.html')更干
-suhailvs

29

根据django文档,您可以使用render快捷方式代替带有context_instance参数的render_to_response:

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


确实,这些天是可能的。
fabspro 2014年

9

从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


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.