(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
为例,我们会在1
上2
无效,在3
关闭div,4
打开它,然后在{{1}上打开一个div ......好吧,它不会关闭,因为4
不是“3系列中的第三个”。所以,虽然Django模板没有模数,但它们确实有一个divisibleby检查,所以我想出了额外的逻辑,如果我们点击[inner] for循环的最后一个元素,它也不能被3整除(所以我们没有重复的关闭),然后关闭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!
所以我不确定从哪里开始。这似乎是known and unfixed issues in Django。有人可以帮忙吗?
tl; dr 我想拍摄一个二维数组,例如L=[ [0,1,2,3,4], [5,6,7] ]
并正确地将其标记为一次不超过3个,并且不将多个数组中的任何元素组合在一起,如下所示:
0 1 2
3 4
5 6 7
该模板代码是什么?为什么?
答案 0 :(得分:14)
您应该可以使用{% if forloop.counter0|divisibleby:"3" %}
来确定何时打开<div>
代码,使用{% if forloop.last or forloop.counter|divisibleby:"3" %}
来确定何时关闭</div>
代码。
{% for x in z %}
{% for y in x %}
{% if forloop.counter0|divisibleby:"3" %}<div>{% endif %}
{{ y }}
{% if forloop.last or forloop.counter|divisibleby:"3" %}</div>{% endif %}
{% endfor %}<br/>
{% endfor %}