Django模板中的嵌套点查找

2024-06-17 08:58:55 发布

您现在位置:Python中文网/ 问答频道 /正文

根据The Django Book,Django的模板系统支持嵌套点查找:

Dot lookups can be nested multiple levels deep. For instance, the following example uses {{ person.name.upper }}, which translates into a dictionary lookup (person['name']), then a method call (upper()): '{{ person.name.upper }} is {{ person.age }} years old.'

文档中是否没有广泛介绍这种方法的地精?我在使用嵌套点查找时遇到了问题--下面是一个最小的示例:

在视图.py公司名称:

test = [{'foo': [1, 2, 3], 'bar': [4, 5, 6]}, {'baz': [7, 8, 9]}]
ndx = 'bar'
t = loader.get_template('meh.html')
c = Context({'test': test,
             'ndx': ndx,})
return HttpResponse(t.render(c))

在网页.html模板:

^{pr2}$

生成的HTML:

<pre>
[{'foo': [1, 2, 3], 'bar': [4, 5, 6]}, {'baz': [7, 8, 9]}]
 {'foo': [1, 2, 3], 'bar': [4, 5, 6]}

</pre>

当我期望[4,5,6]时,列表元素中字典键的嵌套查找不会返回任何结果。在

J.J


Tags: thedjangonametest模板foo系统html
3条回答

我认为问题是您期望ndx被求值,而这根本没有发生。你试过这个吗:

{{ test.0.bar }}

我想这能满足你的要求。在

Are there goblins with this approach...?

有点,但它们不是你所说的,我不认为这是因为筑巢,或者至少,当你进入一个深度后,情况不会变得更糟。我的意思是所有查找参数都是文字。没有办法改变这一点。因此,虽然您可能能够开发自定义模板标记并将文本或变量传递给它们以进行求值,但如果您希望根据另一个值的计算值直接访问某个变量的某个成员,那就真是走运了。(您可以为此编写一个模板标记,但它不能在所有需要的情况下工作,而且可能比它的价值更复杂。)

不管值多少钱,这看起来都是模板语言的一个非常有意的方面。我请您考虑访问器应该如何知道{{ foo.bar }}应该读为foo[bar]还是{}。似乎不可能在不使语法复杂化的情况下做出有意义的判断,而这正是django的模板设计坚决要避免的事情。在

为了扩展David的答案,Django的模板系统不允许使用上下文变量的值作为键。所以,在你的例子中

{{ test.0.ndx }}

实际上是在test上下文变量的第一项中查找键"ndx"。在

如果您需要这个功能,您需要自己实现它,作为一个模板过滤器。This ticket提供了更多信息,包括Django开发人员在省略此功能背后的推理,以及您正在寻找的模板过滤器的示例实现。在

David是对的:ndx不会被求值来获得一个密钥,它将被直接用作密钥。您可以定义一个新的模板标记来执行您想要的操作,下面是一个简单的模板标记:http://www.djangosnippets.org/snippets/1412/

相关问题 更多 >