13

说,我有两个对象列表,foo并且bar. foo在Django模板中,在遍历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

4

2 回答 2

11

您是正确的,Django 模板不直接允许这样做,这是因为 Django 试图强迫您将几乎所有的表示逻辑放在您的视图中。您最好的选择是在您的视图中在您的上下文中创建一个字典列表,以便您可以对其进行迭代并按名称访问成员。或者:

  • zip将您的列表放在一起,而不是使它们成为 dict 并使用{% for fooItem, barItem in zippedList %}.
  • 使用限制较少的模板语言,例如Jinja2
  • 按照 Yuji Tomita 的建议,使用自定义模板过滤器
于 2012-12-07T21:40:10.443 回答
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 %}
于 2012-12-07T21:45:37.227 回答