Шаблон 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>