Django、模板、for 循环和循环
Posted
技术标签:
【中文标题】Django、模板、for 循环和循环【英文标题】:Django, templates, for loops, and cycles 【发布时间】:2012-07-25 15:16:44 【问题描述】:(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
......好吧,它不会' t 关闭,因为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
什么是模板代码,为什么?
【问题讨论】:
【参考方案1】:您应该能够使用% 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 %
【讨论】:
以上是关于Django、模板、for 循环和循环的主要内容,如果未能解决你的问题,请参考以下文章
Django 模板语言:使用带有 else 的 for 循环
来自 % for % 的 Django 模板变量循环到 Javascript