1

在我看来,如果我指定

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

然后我可以访问诸如STATIC_URLmyTemplate.html 中的设置。

但是,如果我指定

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。

4

3 回答 3

3

阅读文档以获得更好的答案。但有一个简短的答案:

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

我引用:

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

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

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

于 2012-05-18T22:10:09.613 回答
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参数。

官方文档参考:

于 2012-05-18T22:30:13.487 回答
0

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

def myView(request):
        return render(request, 'myTemplate.html', {'user': request.user,})
于 2012-05-18T22:30:18.603 回答