为什么发送请求上下文让我可以访问我的Django模板中的设置?

时间:2012-05-18 21:57:19

标签: django

在我看来,如果我指定

def myView(request):
    return render_to_response('myTemplate.html', {'user': request.user,}, 
        context_instance=RequestContext(request))

然后我可以访问myTemplate.html中的STATIC_URL等设置。

但是,如果我指定

def myView(request):
        return render_to_response('myTemplate.html', {'user': request.user,})

然后我无法访问STATIC_URL。在后一种情况下,{{ STATIC_URL }}只会在呈现的页面中产生一个空字符串。在前一种情况下,{{ STATIC_URL }}为静态URL生成正确的字符串(“/ static /").

为什么我需要发送请求上下文才能访问模板中的STATIC_URL设置?

我在Apache 2上运行Django 1.4。

3 个答案:

答案 0 :(得分:3)

阅读docs以获得更好的答案。但答案很简短:

这是因为DRY(不要重复自己),想一想:如果你需要在所有模板中通过所有视图设置相同的变量怎么办?:context_processors,是在模板中添加变量的方法有序的方式。

我引用:

  

Django附带了一个特殊的Context类django.template.RequestContext,其作用与普通的django.template.Context略有不同。第一个区别是它需要一个HttpRequest作为它的第一个参数。例如:

c = RequestContext(request, {
    'foo': 'bar',
})
  

第二个区别是它会根据您的TEMPLATE_CONTEXT_PROCESSORS设置自动使用一些变量填充上下文。

答案 1 :(得分:1)

要访问STATIC_URL设置,您需要发送请求上下文,因为默认情况下RequestContext实例会自动填充一些变量,相应地使用TEMPLATE_CONTEXT_PROCESSORS设置,默认情况下也是如此,读到这个:

(...
"django.core.context_processors.static",
...)

关于django.core.context_processors.static上下文处理器,文档声明:

  

如果TEMPLATE_CONTEXT_PROCESSORS包含此处理器,则每个   RequestContext将包含一个变量STATIC_URL,提供值   STATIC_URL设置。

相反,如果您没有指定context_instance=RequestContext(request)部分。考虑一下这个签名:

render_to_response(template_name[, dictionary][, context_instance][, mimetype])

在这种情况下,使用基本的Context实例,并且(因此)只将给定的dictionary项注入模板。此词典可能包含也可能不包含settings.STATIC_URL的值。

注意:正如另一个答案中所指出的,自Django 1.3起,您可以直接使用render快捷方式而不是render_to_response()context_instance参数。

参考官方文件:

答案 2 :(得分:0)

由于您使用的是1.4,因此请使用较新的render()快捷方式。然后你可以这样做:

def myView(request):
        return render(request, 'myTemplate.html', {'user': request.user,})