Django使用locals()

时间:2014-07-31 15:43:30

标签: python django

我是使用Django进行Web开发的初学者。我注意到使用了locals()函数而不是我以前看到的上下文字典。

从我在互联网上看到的locals()非常有用,所以有什么特殊情况不是这样,最好使用context_dictionary吗?

4 个答案:

答案 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()