Gor*_*ran 18 django django-templates
我在页面上有一些循环,需要依赖于循环编号的列表项.
我打电话的时候:
{{ mylist.1 }}
{{ mylist.2 }}
{{ mylist.3 }}
Run Code Online (Sandbox Code Playgroud)
一切正常,但我真正需要的是:
{% for x in somenumber|MyCustomRangeTag %}
{{ mylist.x }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
MyCustomRangeTag给了我Python range()它的工作原理,我已经有了x数字.因此x,取决于循环次数,是1,2,3等.这可能吗?怎么样?
And*_*Dog 28
这是不可能直接的,因为Django认为这"x"是查找的关键mylist- 而不是x 的值.所以,当x = 5Django试图查找mylist["x"]而不是mylist[5].
使用以下过滤器作为解决方法:
@register.filter
def lookup(d, key):
return d[key]
Run Code Online (Sandbox Code Playgroud)
并使用它
{{ mylist|lookup:x }}
Run Code Online (Sandbox Code Playgroud)
我注意到@ e-satisf提到了它,但我认为内置的切片模板标签值得一些爱.
{{ item | slice:"2" }} #gets the third element of the list
Run Code Online (Sandbox Code Playgroud)
Django 模板中的切片标签可能使用 python 的切片代码,但语法明显不同。例如,如果您想获取带有变量的序列的元素,在 python 中您可以编写类似于以下内容的内容:
>>>mylist = ["0th Element", "1th Element"]
>>>zero, one = 0, 1
>>>mylist[zero]
"0th Element"
>>>mylist[one]
"1th Element"
Run Code Online (Sandbox Code Playgroud)
将此语法与 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 %}
Run Code Online (Sandbox Code Playgroud)
渲染为 html:
[] ["0th Element"] ["0th Element", "1th Element"]
Run Code Online (Sandbox Code Playgroud)
请注意差异:您得到的结果是 ,mylist[:x]而不是mylist[x]。
Django 提供了足够的工具来解决这个问题。第一个技巧是使用显式切片(例如0:1索引),然后将|join:""结果列表放入单个元素中。就像这样:
{% with "0:1" as zero %}
{{mylist|slice:zero|join:""}}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)
产量:
0th Element
Run Code Online (Sandbox Code Playgroud)
如果您在处理子循环内的可迭代对象时需要访问父循环的索引,那么这会特别方便:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
尽管我认为 Django 还没有实现成就,但除了库存部件之外什么都没有完成。
| 归档时间: |
|
| 查看次数: |
26816 次 |
| 最近记录: |