根据The Django Book,Django的模板系统支持嵌套点查找:
点查找可以嵌套多个级别。例如,以下示例使用{{person.name.upper}},它转换为字典查找(person ['name']),然后是方法调用(upper()):'{{person.name.upper是{{person.age}}岁。'
文档中是否有广泛涵盖这种方法的哥布林?我遇到嵌套点查找问题 - 这是一个最小的例子:
views.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))
meh.html模板:
<pre>
{{ test }}
{{ test.0 }}
{{ test.0.ndx }}
</pre>
结果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。
答案 0 :(得分:8)
我认为问题在于,您希望在根本不会发生时评估ndx
。你试过这个:
{{ test.0.bar }}
我认为这会做你想要的。
这种方法是否有地精......?
排序,但它们不是你正在谈论的那些,我不认为这是因为嵌套,或者至少,它在你达到一个深度后不会变差< / em>的。我的意思是所有查找参数都是文字。没有办法改变这一点。因此,虽然您可能能够开发自定义模板标记并将它们传递给文字或变量进行评估,但如果您希望根据另一个值的评估值直接访问某个变量的某个成员,那么您真的不走运。 (你可能会为此编写一个模板标签,但它不能在所有需要的情况下工作,并且可能比它的价值更复杂。)
无论它的价值如何,这看起来都像是模板语言的一个非常有意义的方面。我邀请您考虑访问者应该如何知道{{ foo.bar }}
是foo[bar]
还是foo['bar']
。如果没有使语法复杂化,那么似乎不可能做出有意义的判断,这是django的模板设计坚持要避免的。
答案 1 :(得分:4)
为了扩展David的答案,Django的模板系统不允许您使用上下文变量的值作为键。所以,在你的例子中
{{ test.0.ndx }}
实际上是在"ndx"
上下文变量的第一项中查找键test
。
如果您需要此功能,则需要自己实施,作为模板过滤器。 This ticket有更多信息,包括Django开发人员在省略此功能背后的推理以及您正在寻找的模板过滤器的示例实现。
答案 2 :(得分:1)
David是对的:ndx
不会被评估以获得密钥,它将被用作字面上的密钥。您可以定义新的模板标记以执行您想要的操作,这里只是一个简单的标签:http://www.djangosnippets.org/snippets/1412/
答案 3 :(得分:1)
我建议(并且我同意David对你的问题的解释):
{{ test.0.bar }} # as david mentioned, or
ndx=test[0]['bar'] # in views
{{ ndx }} # in template