2009-12-18 149 views
5

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

作为一个精灵,我深深地被整个比赛的这个表征得罪... ;-) – cethegeek 2009-12-18 18:08:06

回答

8

我认为问题在于,当期望ndx时,根本不会发生这种情况。你有没有试过这个:

{{ test.0.bar }} 

我认为那会做你想找的。

有没有这种方法的地精......?

排序的,但他们是不是你在谈论的,我不认为这是因为嵌套的,或者至少,它不会变得更糟后,你会得到一个层次深度。我的意思是所有查找参数都是文字。没有办法改变这一点。因此,尽管您可能能够开发自定义模板标签并将它们传递给文字或变量进行评估,但如果您想根据另一个值的评估值直接访问某个变量的某个成员,那么您确实不太走运。 (你可能会为此写一个模板标签,但它不能在所有需要的情况下工作,并且可能比它的价值更复杂。)

对于任何值得的东西,这看起来像是模板的一个相当有意义的方面语言。我邀请您考虑访问者应该如何知道{{ foo.bar }}应该被看作foo[bar]还是foo['bar']。似乎不可能在不使语法复杂化的情况下做出有意义的判断,这是django的模板设计坚决避免的。

+2

感谢您回答我*应该*问的问题。 :-) – 2009-12-18 18:45:15

1

大卫说得对:ndx将不会被评估得到一个关键,它将被直接用作关键。你可以定义一个新的模板标签来做你想做的事情,这里有一个简单的例子:http://www.djangosnippets.org/snippets/1412/

4

为了扩展David的回答,Django的模板系统不允许你使用上下文变量的值作为关键字。所以,在你的榜样

{{ test.0.ndx }} 

实际上是在test上下文变量的第一个项目寻找关键"ndx"

如果您需要此功能,则需要自行实施,作为模板过滤器。 This ticket有更多的信息,包括Django开发人员推断此功能被遗漏的原因以及您正在寻找的模板过滤器的示例实现。

1

我建议是(我与您的问题大卫的解释达成协议):

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

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