如何在Django模板中使用变量索引访问列表?

时间:2012-12-07 21:35:38

标签: django django-templates

说,我有两个对象列表,foobar。在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

2 个答案:

答案 0 :(得分:10)

Django模板不直接允许这样做是正确的,因为Django试图迫使你在你的视图中放置几乎所有的表示逻辑。您最好的选择是在视图中创建上下文中的dicts列表,这样您就可以迭代它并按名称访问成员。或者:

  • zip将您的列表放在一起,而不是将它们设为dict并使用{% for fooItem, barItem in zippedList %}访问它们。
  • 使用限制较少的模板语言,例如Jinja2
  • 使用Yuji Tomita建议的自定义模板过滤器

答案 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 %}