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

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)

  • @zengr尝试`{%with lookup_result = mylist | lookup:x%} {{lookup_result.first_name}} {%endwith%}`. (3认同)
  • 如果`{{mylist | lookup:x}}`的输出是一个对象并且我还需要访问某些东西怎么办?像`mylist.1.first_name`之类的东西 (2认同)

Mat*_*ngo 5

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

{{ item | slice:"2" }} #gets the third element of the list
Run Code Online (Sandbox Code Playgroud)

  • `{%with"2"as var%} {{mylist | slice:var}} {%endwith%}` (2认同)

Tim*_*ord 5

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 还没有实现成就,但除了库存部件之外什么都没有完成。