5

(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不是“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!

所以我不确定从这里去哪里。这似乎是Django 中一个已知且未修复的问题。有人可以帮忙吗?

tl;博士我想取一个二维数组,例如L=[ [0,1,2,3,4], [5,6,7] ]并正确标记它一次不超过 3 个分组,并且不将多个数组中的任何元素组合在一起,如下所示:

0  1  2
3  4

5  6  7

什么是模板代码,为什么?

4

1 回答 1

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 %}
于 2012-07-27T00:13:28.973 回答