我是使用Django进行Web开发的初学者。我注意到使用了locals()
函数而不是我以前看到的上下文字典。
从我在互联网上看到的locals()
非常有用,所以有什么特殊情况不是这样,最好使用context_dictionary
吗?
答案 0 :(得分:10)
在该教程中使用locals()
只是为了方便,因为他需要传递给模板的所有数据都存储在本地变量中。 locals()
返回一个包含局部变量名称(作为键)和当前值(作为值)的字典。
如果必须构建数据并且在单独的变量中没有此类数据,则需要使用显式的context_dictionary,而不是传递locals()
。
locals()
和context_dictionary都是字典,这是唯一的要求:类似字典的对象(即支持__getitem__(key)
和get(key, default=None)
方法的对象)。如何获得字典,取决于你。对此没有任何实践,但替代方案是:
RequestContext()
,请返回CONTEXT_PROCESSORS
,这是一个类似字典的对象。locals()
。编辑 - 示例:
自行构建字典的示例:
def my_view(request):
return render_to_response('hello.html', {
'full_name': u"%s %s" % (request.user.first_name, request.user.last_name),
'username': request.user.username
})
从locals()
构建字典的示例:
def my_view(request):
full_name = u"%s %s" % (request.user.first_name, request.user.last_name)
username = request.user.username
return render_to_response('hello.html', locals())
假设hello.html是 - 在任何一种情况下:
<html>
<body>
You are {{ full_name }} ({{ username }})
</body>
</html>
你会得到预期的结果。
答案 1 :(得分:1)
如果你的观点看起来像这样:
def myview(request):
thing = 1
name = 'fred'
stuff = ['a', 'b', 'c']
并在您希望的模板中执行:
{{ thing }} of {{ name }} has {% for x in stuff %}{{ x }}{% endfor %}
然后在视图中你可以:
return render(request, 'template.html', locals())
这是因为locals()
返回当前范围内所有本地定义变量的dict。所以这是一种偷偷摸摸的捷径。
但要小心,因为你可能会暴露出比你想要的更多的值......通常我们更喜欢Zen of Python中的“明确比隐含更好”的方法,即定义一个只包含什么的词典你想传递给模板。
def myview(request):
context = {
'thing': 1,
'name': 'fred',
}
# do more code...
context['stuff'] = ['a', 'b', 'c']
return render(request, 'template.html', context)
答案 2 :(得分:0)
上下文字典的意思是命名参数?如果是,它们会有所不同,本地人会显示所有本地变量,而kwargs字典则只显示命名参数。
def test(**kwargs):
c = 'abc'
print kwargs
print locals()
test(a=10, b=20)
第一次打印显示:{&#39; a&#39;:10,&#39;&#39;:20},而第二个显示:{&#39; c&#39;:&#39 ; abc&#39;,&#39; kwargs&#39;:{&#39; a&#39;:10,&#39; b&#39;:20}}
答案 3 :(得分:0)
locals()
是Python的内置函数,根据官方Python documentation:
更新并返回代表当前本地符号表的字典。在功能块中调用
locals()
会返回自由变量,而在类块中则不会。
示例:
In [1]: def f():
...: a = 1
...: b = 2
...: c = 'three'
...:
...: return locals()
...:
In [2]: f()
Out[2]: {'a': 1, 'b': 2, 'c': 'three'}
当您要使用在视图中定义的变量来创建字典时,locals()
可能有助于避免重复(可能大部分或所有创建的变量都是将包含在上下文字典中)。
但是,使用locals()
不利于重构。执行重构时,可以自由更改视图的局部变量。然后,您不能安全地重命名变量,因为它们没有可见的效果。您可能还会遇到的另一个问题是 performance ,因为您可能会在上下文中包含实际上并不需要的变量,并且如果您的视图声明了许多时间变量,则上下文将被重载。
因此,最好避免使用locals()
。