(tl;博士在底部)
让我尝试解释一下我想要完成的任务:我有一个二维数组,我想以某种方式显示其内容。我想要“行”,并且每行只能显示不超过三个“对象”,因为缺乏更好的词。所以我想迭代该数组并在此过程中创建 HTML。我的想法是这样的:数组中的每个“三个中的第一个”元素都应该打开“行”。每个“三分之三”元素都应关闭“行”。但是,如果 [inner] 数组中的最后一个元素恰好不是“三个中的第三个”,它仍然应该关闭该行。所以,举例来说,如果我们有类似的东西L=[ [0,1,2,3,4], [5,6,7] ]
,我想像这样显示它:
0 1 2
3 4
5 6 7
可能会被标记为:
<div>0 1 2</div>
<div>3 4</div>
<div>5 6 7</div>
我的第一个想法是简单地使用模运算符,看看每次迭代是否是一行的“第一”、“第二”或“第三”,但 Django 模板不直接支持模(稍后会详细介绍)。
所以我想出了这样的模板代码:
{% for x in L %}
{% for y in x %}
{% cycle '<div>' '' '' %}
{{ y }}
{% cycle '' '' '</div>' %}
{% endfor %}<br/>
{% endfor %}
这是一个好的开始。就拿上面的例子来说,0
我们将打开一个 div,1
什么都不做,在2
关闭 div,打开3
打开它,然后4
...好吧,它不会关闭,因为4
不是“三系列中的第三个”。因此,虽然 Django 模板没有模数,但它们确实有一个可整除的检查,所以我想出了额外的逻辑来说明,如果我们命中 [inner] for 循环的最后一个元素,并且它也不能被 3 整除(所以我们没有重复的 close),然后关闭 div:
{% for x in z %}
{% for y in x %}
{% cycle '<div>' '' '' %}
{{ y }}
{% cycle '' '' '</div>' %}
{% if forloop.last %}
{% if forloop.counter|divisibleby:"3" %}
<!-- Row Already Closed -->
{% else %}
</div>
{% endif %}
{% endif %}
{% endfor %}<br/>
{% endfor %}
这效果更好!现在,我使用正确的标记完成了整个第一个内部数组。我的问题是这样的:显然,当你超出内部 for 循环的范围时,Django 的循环功能不会重置。这意味着,我的号码5
从上面的例子来看,没有像它应该的那样打开一个div,它没有被识别为循环中的第一个。事实上,它实际上被识别为第三个,因此它正在关闭一个 div!
所以我不知道从这里该去哪里。这似乎是一个Django 中已知和未解决的问题 https://code.djangoproject.com/ticket/5908。有人可以帮忙吗?
tl;dr我想要一个二维数组,例如L=[ [0,1,2,3,4], [5,6,7] ]
并正确标记它,一次分组不超过 3 个,并且不将多个数组中的任何元素分组在一起,如下所示:
0 1 2
3 4
5 6 7
其模板代码是什么?为什么?