在Django中,在一个模板变量的点理论上表示一个查找,基于分辨率的以下顺序上:Django的:模板字典/对象交叉引用
- 字典查找。示例:
foo["bar"]
- 属性查找。示例:
foo.bar
- 方法调用。示例:
foo.bar()
- 列表索引查找。示例:
foo[bar]
从rendering a context in django 1.2(docs.djangoproject.com)。
在现实:
视图:
...
class Veggie(object):
def __init__(self, name):
self.name = name
veggies = {'a': Veggie('carrot'), 'b': Veggie('lettuce')}
basket = ['a', 'c', 'b']
return render_to_response('tpls/veggies.txt',
{'veggies': veggies, 'basket': basket},
mimetype="text/plain")
模板:
Veggie by basket order, showing name
{% for veg in basket %}
{{ veg }}
{{ veggies.veg.name }}
{% endfor %}
输出:
Veggie by basket order, showing name
a
c
b
该输出中没有素食名。
我认为这不是Django所说的那样。我明白,我可以写一个标签来解决这个问题。这很丑陋。
这是一个没有对Django开发团队修复,按照Django ticket 12486,因为“我们的目的是,Django的模板,可以读取和非程序员编写的,因此复杂的逻辑应该是视图代码或自定义模板标签。” (Luke工厂)
对于在这种情况下编写可读的模板代码的一些实用建议,我很感激(我有很多不同种类的“蔬菜”来解引用)。如果我们有模板编写人员 - 他们知道如何进行字典查找,那么是否值得从Django中脱身?
我知道你知道是怎么回事,但我不明白为什么你认为违背它在文档中说。相反,您引用的文档非常清晰,并且其中没有任何内容表示它会将变量用作字典键。 –