18

テンプレートでコレクションを表現し、4つの要素ごとにラップする必要があります

<li></li>

テンプレートは次のようになります。

<ul>
    <li>
         <a></a>
         <a></a>
         <a></a>
         <a></a>
    </li>
    <li>
         <a></a>
         <a></a>
         <a></a>
         <a></a>
    </li>
    <li>
         <a></a>
         <a></a>
         <a></a>
         <a></a>
    </li>
</ul>

だから私は{%for%}でそれをする必要があります

{% for obj in objects %}
 {#add at 1th and every 4th element li wrap somehow#}
    <a>{{object}}</a>
 {# the same closing tag li#}
{% endfor %}
4

5 に答える 5

61

組み込みのテンプレートタグを使用して、次のようにして問題を解決する必要があります。

<ul>
    <li>
    {% for obj in objects %}
        <a>{{ obj }}</a>

    {# if the the forloop counter is divisible by 4, close the <li> tag and open a new one #}
    {% if forloop.counter|divisibleby:4 %}
    </li>
    <li>
    {% endif %}

    {% endfor %}
    </li>
</ul>
于 2012-08-15T06:46:25.493 に答える
18

前述のように divisibleby タグを使用できますが、テンプレートをクリアする目的で、通常はジェネレーターを返すヘルパー関数を好みます。

def grouped(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

単純化されたビューの例:

from app.helpers import grouped

def foo(request):
    context['object_list'] = grouped(Bar.objects.all(), 4)
    return render_to_response('index.html', context)

テンプレートの例:

{% for group in object_list %}
   <ul>
        {% for object in group %}
            <li>{{ object }}</li>
        {% endfor %}
   </ul>
{% endfor %}
于 2012-08-15T08:02:50.923 に答える
3

divisibleby 組み込みフィルターを使用できます。ここに django ドキュメントへのリンクがあります

したがって、このようなものが機能します

{% if value|divisibleby 4 %}
#your conditional code
{% endif %}
于 2012-08-15T06:33:50.860 に答える
2

最初の forloop と最後の forloop をチェックして作業したい場合は、これを使用できます:

<ul>
{% for obj in objects %}
{% if forloop.first %}
    <li>
{% endif %}
        <a>{{obj}}</a>
{% if forloop.counter|divisibleby:4 and not forloop.first %}
    </li>
    <li>
{% endif %}
{% if forloop.last %}
    </li>
{% endif %}
{% endfor %}
</ul>
于 2017-10-10T02:51:18.083 に答える
1

個人的には、テンプレートに渡す前にビュー内の要素を分離し、ネストされた for ループを使用することを検討します。これを除いて、Vaibhav Mishra が述べたように、実際には filter または templatetag オプションしかありません。

于 2012-08-15T06:36:06.130 に答える