说,我有两个对象列表,foo
和bar
。在Django模板中,在循环foo
时,有一个计数器跟踪当前索引/迭代,计数器用于访问bar
。这里的问题是我不认为Django模板系统支持使用变量索引访问列表。真的吗?如果是这样,问题是否有任何解决方法(除了用硬编码索引重复相同的html /模板代码)?
代码演示:
{% for x in foo %}
<span>{{ x.name }} vs. {{ bar.{{ forloop.counter0 }}.name }}</span>
{% endfor %}
Django模板不喜欢{{ bar.{{ forloop.counter0 }}.name }}
注意:我正在使用Django 1.4
答案 0 :(得分:10)
Django模板不直接允许这样做是正确的,因为Django试图迫使你在你的视图中放置几乎所有的表示逻辑。您最好的选择是在视图中创建上下文中的dicts列表,这样您就可以迭代它并按名称访问成员。或者:
zip
将您的列表放在一起,而不是将它们设为dict并使用{% for fooItem, barItem in zippedList %}
访问它们。 答案 1 :(得分:5)
是的,您无法解析变量名称。绝对要非常努力地将这个逻辑放在视图中。
但有5%的时间,我确实发现这极其有限,有时需要在模板作者控制之外的视图/更改中太多逻辑。我接受了一些个人定制,允许在视图中进行变量赋值以及简单的变量分辨率。
使用模板引擎“所有查找在一个”系统(索引,属性,键)中构建模板标签非常简单。
from django.template import Variable, VariableDoesNotExist
@register.assignment_tag()
def resolve(lookup, target):
try:
return Variable(lookup).resolve(target)
except VariableDoesNotExist:
return None
{% resolve some_list some_index as value %}
{% resolve some_dict some_dict_key as value %}