为什么这个Django模板上下文处理器没有应用于所有请求?

时间:2011-07-11 16:26:44

标签: django django-templates

我遇到了以下Django模板上下文处理器问题。

上下文处理器在myapp/context_processors.py

中定义
def my_context_processor(request):
    return {
        'foo': 123,
    }

它与settings.py以及标准Django上下文处理器连接:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'myproject.myapp.context_processors.my_context_processor',
)

我遇到的问题是my_context_processor并未应用于所有请求。

未应用以下代码:

def index(request):
    return render_to_response("index.html", locals())

但是,已应用以下代码:

def index(request):
    return render_to_response("index.html", locals(), context_instance=RequestContext(request))

我的印象是上下文处理器适用于所有请求,而不仅仅是在提供context_instance时。

如何让我的上下文处理器应用于所有请求?

3 个答案:

答案 0 :(得分:11)

您已回答了自己的问题。它适用于使用RequestContext的响应。它不适用于没有的那些。

将其应用于所有响应的方法是确保始终使用RequestContext。或者,在Django 1.3+中,您可以使用新的render快捷方式而不是render_to_response,它会为您创建一个RequestContext。

答案 1 :(得分:3)

Django在Django 1.3中引入了一个新的render快捷方式,它自动包含RequestContext

from django.shortcuts import render

def my_view(request):
    # View code here...
    context = {
        'some_extra_var_for_template': 'value'
    }
    return render(request, 'myapp/index.html', context)

您可以在Django docs

中阅读相关内容

答案 2 :(得分:0)

上下文处理器变量仅在将RequestContext对象(使用当前请求初始化)作为context_instance发送到模板时可用。