Шаблон Django {% for%} добавляет li каждый 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 %}

Ответы

Ответ 1

Следующее должно решить вашу проблему, используя встроенные теги шаблонов:

<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>

Ответ 2

Вы можете использовать тег 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 %}

Ответ 3

вы можете использовать divisibleby встроенный фильтр, вот ссылка на документацию django

так что-то вроде этого будет работать

{% if value|divisibleby 4 %}
#your conditional code
{% endif %}

Ответ 4

Я лично хотел бы выделить элементы в представлении перед тем, как передать их в шаблон, а затем использовать вложенные для циклов. Кроме этого у вас действительно есть опция фильтра или templatetag, как упоминал Вайбхав Мишра.

Ответ 5

если вы хотите работать с проверкой первого 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>