我在页面上有一些循环,需要依赖于循环编号的列表项。
我打电话的时候:
{{ mylist.1 }}
{{ mylist.2 }}
{{ mylist.3 }}
一切正常,但我真正需要的是:
{% for x in somenumber|MyCustomRangeTag %}
{{ mylist.x }}
{% endfor %}
MyCustomRangeTag为我提供了Python range()
,但我已经将x
作为数字。所以x
是1,2,3等,取决于循环数。
这可能吗?如何?
答案 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左右使用括号