使用forloop在django模板中创建自定义表

时间:2016-08-09 13:38:19

标签: django

我需要在django模板中创建一个自定义表格,如下所示:

    <table>
    <tr>
        <td>
        </td>
        <td>
        </td>
        <td>
        </td>
    </tr>
    <tr>
        <td>
        </td>
        <td>
        </td>
        <td>
        </td>
    </tr>
    <tr>
        <td>
        </td>
        <td>
        </td>
        <td>
        </td>
    </tr>
</table>

即我想在每3个td标签后添加新的tr标签。我尝试使用{{forloop.counter | divisibleby:4}}来应用逻辑。 我尝试了类似下面的内容,但没有产生预期的结果。

{% for items in range(5) %}
    {% if forloop.counter ==1 or forloop.counter|divisibleby:4 %}\
    <tr>
    {% endif %}
    <td>name</td>

    {% if forloop.counter|divisibleby:4 %}
        </tr>
    {% endif %}
    </tr>
{% endfor %} 

但显然不是正确的解决方案。 的更新 它产生如下所示的内容:Output 每张图片都是td标签

2 个答案:

答案 0 :(得分:1)

对于正确的数字,此部分的评估结果为真:

{% if forloop.counter ==1 or forloop.counter|divisibleby:4 %}

当计数器为1,4,8,12等时,这将被评估为真。不是每3个数字,而是每4个数字。 相反,请使用forloop.counter0,如下所示:

{%if forloop.counter0 | divisibleby:3%}

forloop.counter0从0开始,所以它可以在0,3,6,9等处被3整除,就像你想要的那样。

您的代码还有另一个问题:

{% if forloop.counter|divisibleby:4 %}
    </tr>
{% endif %}
</tr>

如果您只想在每第三个元素后关闭标记,则删除if条件之外的标记。 此外,您还要在错误的部分添加结束标记。在你再次打开标签之前它应该是一个元素,所以在第3个元素,第6个元素等等。 为此,您仍然可以使用forloop.counter,如此:

{% if forloop.counter|divisibleby:3 %}
    </tr>
{% endif %}

总体而言,您的代码应如下所示:

{% for items in range(5) %}
    {% if forloop.counter0|divisibleby:3 %}
        <tr>
    {% endif %}
    <td>name</td>
    {% if forloop.counter|divisibleby:3 %}
        </tr>
    {% endif %}
{% endfor %}
</tr>

如果您使用的是未知nbr个项目而不是5个,只需将for {{1>}标记替换为forloop

</tr>

如果在for循环的最后一次迭代中添加了{% if not nbr|divisibleby:3 %} </tr> {% endif %} ,那么你将不会有两个</tr>

答案 1 :(得分:1)

所以这是因为如果forloop计数器可被4整除,则插入<tr> AND </tr>。如果forloop计数器为1,则还插入<tr>。所以第一行工作时,第二行将插入开始和结束标记(因为forloop计数器仍可被4整除)。你的逻辑已关闭。

我想你想要:

<table> {% for items in range(5) %} {% if forloop.counter == 1 %} <tr> {% endif %} <td>name</td> {% if forloop.counter|divisibleby:4 %} </tr><tr> {% endif %} {% endfor %} </tr> </table>