Django,模板,for循环和循环

时间:2012-07-26 23:18:37

标签: django django-templates

(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为例,我们会在12无效,在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

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

1 个答案:

答案 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 %}