Python Django模板中的嵌套点查找

Python Django模板中的嵌套点查找,python,django,django-templates,Python,Django,Django Templates,根据,Django的模板系统支持嵌套点查找: 点查找可以嵌套到多个级别。例如,下面的示例使用{{person.name.upper},它转换为字典查找(person['name']),然后一个方法调用(upper()):{{person.name.upper}}是{{person.age}岁 文档中是否没有广泛介绍使用这种方法的地精?我在嵌套点查找方面遇到问题--下面是一个简单的示例: views.py: test = [{'foo': [1, 2, 3], 'bar': [4, 5, 6]},

根据,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))
<pre>
   {{ test }}
   {{ test.0 }}
   {{ test.0.ndx }}
</pre>
{{ test.0.bar }}
meh.html模板:


{{test}}
{{test.0}}
{test.0.ndx}
生成的HTML:


[{'foo':[1,2,3],'bar':[4,5,6]},{'baz':[7,8,9]}]
{'foo':[1,2,3],'bar':[4,5,6]}
当我期望[4,5,6]时,在列表元素中嵌套查找字典键不会返回任何结果


J.J.

我认为问题在于,您希望对ndx进行评估,而这种情况根本不会发生。你试过这个吗:

{{ test.0.bar }} # as david mentioned, or

ndx=test[0]['bar'] # in views
{{ ndx }} # in template
我想这会满足你的要求

有这种方法的地精吗

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


不管它值多少钱,这看起来像是模板语言的一个非常有意的方面。我请您考虑访问器应该如何知道<代码> {{0}.bar } <代码>应被读取为<代码> fo[bar ] < /> >或<代码> fo[’bar ] < /代码>。在不使语法复杂化的情况下做出有意义的判断似乎是不可能的,django的模板设计坚决避免这一点。

David是对的:
ndx
不会被计算来得到一个键,它会被用作一个键。你可以定义一个新的模板标签来做你想做的事情,这里有一个简单的:

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

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

如果您需要此功能,您需要自己实现它,作为模板过滤器。有更多信息,包括Django开发人员省略此功能的原因以及您正在寻找的模板过滤器的示例实现。

我建议(我同意David对您的问题的解释):


作为一个地精,我对这种对整个种族的描述深感愤怒…;-)谢谢你回答我应该问的问题。:-)
{{ test.0.ndx }}
{{ test.0.bar }} # as david mentioned, or

ndx=test[0]['bar'] # in views
{{ ndx }} # in template