在django模板中动态获取列表项

时间:2012-01-20 22:01:19

标签: django django-templates

我在页面上有一些循环,需要依赖于循环编号的列表项。

我打电话的时候:

{{ mylist.1 }}
{{ mylist.2 }}
{{ mylist.3 }}

一切正常,但我真正需要的是:

{% for x in somenumber|MyCustomRangeTag %}
    {{ mylist.x }}
{% endfor %}

MyCustomRangeTag为我提供了Python range(),但我已经将x作为数字。所以x是1,2,3等,取决于循环数。 这可能吗?如何?

5 个答案:

答案 0 :(得分:26)

这是不可能直接的,因为Django认为"x"是在mylist中查找的关键 - 而不是 x的值。因此,当x = 5时,Django会尝试查找mylist["x"]而不是mylist[5]

使用以下过滤器作为解决方法:

@register.filter
def lookup(d, key):
    return d[key]

并像

一样使用它
{{ mylist|lookup:x }}

答案 1 :(得分:6)

我注意到@ e-satisf提到了它,但我认为内置的切片模板标签值得一些爱。

{{ item | slice:"2" }} #gets the third element of the list

答案 2 :(得分:4)

Django模板中的slice标签可能使用python的切片代码,但语法明显不同。例如,如果你想获得一个带变量的序列的元素,在python中你会写一些类似于以下内容的东西:

>>>mylist = ["0th Element", "1th Element"]
>>>zero, one = 0, 1
>>>mylist[zero]
"0th Element"
>>>mylist[one]
"1th Element"

在Django切片模板标签中使用此语法将在每种情况下返回切片列表,用于获取已知索引的项目的可疑实用程序:

{% with "0" as zero %}
{% with "1" as one %}
{% with "2" as two %}

{{mylist|slice:zero}} {{mylist|slice:one}} {{mylist|slice:two}}

{% endwith %}
{% endwith %}
{% endwith %}

渲染到html:

[] ["0th Element"] ["0th Element", "1th Element"]

请注意区别:您获得mylist[:x]而不是mylist[x]的结果。

Django提供了足够的工具来解决这个问题。第一个技巧是为您的索引使用0:1等显式切片,然后将|join:""结果列表放入单个元素中。像这样:

{% with "0:1" as zero %}
{{mylist|slice:zero|join:""}}
{% endwith %}

收率:

0th Element

如果在处理子循环内的迭代时需要访问父循环的索引,这会特别方便:

{% for parent in parent_loop %}
    {% cycle "0:1" "1:2" "2:3" as parent_loop_index silent %}
    {% for child in child_loop %}
        {{child|slice:parent_loop_index|join:""}}
    {% endfor %}
{% endfor %}

虽然我认为Django尚未实现成就,但已完成除了库存部分之外什么都没有。

答案 3 :(得分:3)

您确定不能这样做:

{% for item in mylist %}
    {{ item }}
{% endfor %}

使用切片过滤器,您甚至可以进行一些自定义。

答案 4 :(得分:0)

以下为我工作

{% for 1,2,3 in mylist %}
# do stuff

请不要在1,2,3左右使用括号