【发布时间】:2021-07-23 16:49:24
【问题描述】:
假设list0 带有元素['a','b','c','d'],我需要根据forloop.counter0 之类的模板变量或模板中可用的任何其他整数来获取第n 个元素。
到目前为止,我发现更好的方法是创建自定义标签,如 here 或 here 和 django doc 中所述。
定义后,您可以编写如下内容:
{% for elm in list0 %}
{{ elm }} {{ list1|index:forloop.counter0 }}
{% endfor %}
该示例假设有另一个列表list1,其中元素['A','B','C','D']。index 是自定义过滤器的名称,它使用forloop 计数器作为索引来获取每个list1 元素:@ 987654334@、list1[1]、list1[2]、list1[3]
所以这会生成:
a A
b B
c C
d D
但如果您只想使用内置过滤器怎么办?
(或者有空闲时间做娱乐活动?)
经过一些研究和测试,我发现的唯一方法就是这个奇怪的东西:
{% for elm in list0 %}
{% with sl0=forloop.counter0|make_list sl1=forloop.counter|make_list %}
{% with header_id=sl0.0|add:":"|add:sl1.0 %}
{{ elm }} {{ list1|slice:header_id|join:"" }}
{% endwith %}
{% endwith %}
{% endfor %}
它的作用:
它使用slice 内置过滤器。 slice 需要一个表示 python 列表部分的字符串,如
'[2:3]',它由第二个with和两个add生成。因此,需要使用 forloop 计数器一次切一个成员:'[0:1]'、'[1:2]'、'[2:3]'...但forloop.counter0和forloop.counter是整数,而add不会在这个案例。它试图得到一个整数作为结果。因此需要将其转换为字符串。这就是为什么在第一个with中使用make_list的原因,因为这是迄今为止我发现的将整数更改为字符串的唯一方法。最后切片返回一个包含一个元素的列表,因此它使用join:""进行转换它是一个字符串。
我希望我错过了文档中的某些内容,因为上面的代码......好吧......很糟糕 - 但很有趣。
如何使用 django 内置模板有效地满足这一需求?
我同意在视图中而不是模板中构建上下文时应该解决它,但是假设它不能完成。
【问题讨论】:
-
在视图
zip_obj = zip(list0, list1)中,在模板{% for elm0, elm1 in zip_obj %}中,为什么所有这些索引都在模板中而不在模板中?此外,您没有错过文档中的任何内容,因为将模板与逻辑分开是经过深思熟虑的设计决定。 -
@AbdulAzizBarkat:是的,这正是为了防止这里发生的事情,人们编写复杂的代码,这通常需要很多周期。
-
谢谢。在我的问题中,请注意“我同意在视图中而不是模板中构建上下文时应该解决它,但假设它不能完成。”。显然我知道 zip()。另外,既然有一个切片模板过滤器,为什么没有一个索引呢?
标签: python django django-templates