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" % 确定何时打开&lt;div&gt; 标记,并使用% if forloop.last or forloop.counter|divisibleby:"3" % 确定何时关闭&lt;/div&gt; 标记。

% 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

如何在 Django 模板语言中正确构建 for 循环

如何在Django模板的内部for循环中使用外部for循环值

如何在 django 模板中从 for 循环中转义一行

Django - 在模板的for循环中迭代数字