Как правильно вывести данные в таблицу в шаблоне django по 5 значений на строку?
извиняюсь за, возможно, глупый вопрос, просто являюсь новичком, но решить проблему не могу.
В общем. Есть таблица в бд, продукты. Есть шаблон в который все это выводится, в виде таблицы. Так вот проблема в том, что все продукты выводятся только в 1 строку. А хотелось бы по 5 продуктов в одной строке, затем переход на следующую строку, снова 5 продуктов, переход и тд. Таблицу упростил чтоб проще читалось.
{% block content %}
{% sidebar %}
<div class="body_content">
<table class="table table-borderless">
<thead>
<tr>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row"></th>
{% for product in products %}
<td>
{{product.name}}
</td>
{% endfor %}
</tr>
</tbody>
</table>
</div>
{% endblock %}
1 способ, более легкий. Обработать список продуктов на уровне view.
Создать утильную функцию, которая будет делить список на блоки. Пример реализации:
def split_list_into_blocks(lst, block_size):
return [lst[i:i+block_size] for i in range(0, len(lst), block_size)]
После получения во view продуктов из базы разделить продукты на блоки по 5 штук с помощью утильной функции. Получится список, в котором будут дочерние списки по 5 элементов.
В шаблоне перебираешь - сначала блок, затем элементы блока.
<tbody>
{% for block in product_block %}
<tr>
{% for product in block %}
<td>
{{ product.name }}
</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
Минусы данного способа: если элементов меньше, чем размер блока, то в таблице у тебя будет недостаточное количество ячеек. По описанию вопроса тяжело понять, насколько для тебя это критично. А также если ты используешь список продуктов ещё в другом месте на странице, то в контексте придется дублироваться, либо везде использовать этот список подсписков. Это плохо.
2 способ, более правильный. То же самое, что и в 1 способе, но не на уровне view, а на уровне шаблона.
Можно создать собственный тег для шаблона. По сути, тег это такая же функция. Логика тега будет такой же, как и утильного метода split_list_into_blocks(). Сделать тег универсальным и каждый раз класть в него объекты, которые нужно пагинировать
Минусы данного способа: ещё никуда не девается проблема с числом продуктов меньше, чем размер блока. А также данный способ сложнее и дольше для новичка