在我看来,如果我指定
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。
答案 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,})