17

未定義の長さのアイテムのリストがあるカタログを作成しています。それぞれ3列の行に吐き出したいです。だから私は次のhtmlを持っています:

<div class="row">
    <div class="three columns">item 1
    </div>
    <div class="three columns">item 2
    </div>
    <div class="three columns">item 3
    </div>
</div>
<div class="row">
    <div class="three columns">item 4
    </div>
    <div class="three columns">item 5
    </div>
    <div class="three columns">item 6
    </div>
</div>

これをdjangoテンプレートとして実装する方法については行き詰まっていますか?3つのアイテムの後に新しい行が始まるように分割するにはどうすればよいですか?

4

4 に答える 4

43

次のようなものを試してください。

<div class="row">
{% for item in items %}
    <div class="three columns">{{ item }}
    </div>
    {% if forloop.counter|divisibleby:3 %}
</div>
<div class="row">
    {% endif %}
{% endfor %}
</div>
于 2012-10-24T11:19:46.067 に答える
5

3つのアイテムのリストのリストを返すカスタムテンプレートフィルターを作成してみることができます。

クイックアテンプト:

@register.filter
def splitByThree(data):
    return [l[i:i+3] for i in range(0, len(l), 3)]

そして、あなたのテンプレートで:

{% load splitByThree %}

{% for list in data|splitByThree %}
<div class="row">
{% for item in list %}
<div class="three columns">{{ item }}</div>
{% endfor %}
</div>
{% endfor %}
于 2012-10-24T11:21:29.963 に答える
4

forloop.counter変数とdivisiblebyフィルターを使用できます。コードはこれに近くなります:

{% for item in items %}
    {% if forloop.first %}
        <div class="row">
    {% endif %}
    <div class="three columns">{{ item }}</div>
    {% if forloop.counter|divisibleby:"3" %}
        </div>
        {% if not forloop.last %}
            <div class="row">
        {% endif %}
    {% endif %}
    {% if forloop.last %}
         </div>
    {% endif %}
{% endfor %}
于 2012-10-24T11:23:40.673 に答える
1

申し訳ありませんが、 jpicの回答(受け入れられた回答)にコメントするだけの評判はありません。Jinja2の場合は、次を使用してください。

<div class="row">
{% for item in items %}
    <div class="three columns">{{ item }}
    </div>
    {% if loop.index is divisibleby(3) %}
</div>
<div class="row">
    {% endif %}
{% endfor %}
</div>

詳細はこちらです。

于 2017-06-17T06:05:25.810 に答える