Как я могу отобразить таблицу в шаблоне с дополнительными строками категорий/разделов?
Хорошего дня!
У меня есть нестандартная таблица. Которую я планирую отобразить в шаблоне.
Я загружаю таблицу в шаблон из модели. И у меня есть дополнительные разделы - дополнительные поля. Эти дополнительные поля характеризуют - Категорию, раздел, темы. Я думаю, как отобразить такую таблицу из модели в шаблоне - как показано на картинке.
Для дополнительной реализации дополнительных полей - категорий или разделов в таблице.
У меня есть приблизительное представление -
Я должен создать транзитную модель именно для такой таблицы - в которой количество строк равно количеству строк исходной таблицы + плюс количество строк разделов категорий в дополнение. То есть, в исходной таблице может быть около 25 строк и + плюс 6 строк - разделы категорий. Всего в требуемой таблице будет 31 строка строк.
введите описание изображения здесь
Но как отобразить их в виде, как на моей картинке, - разделив категории на разделы?
models.py
class CreateNewGPR (models.Model):
name_object = models.IntegerField(verbose_name="")
name_category = models.CharField(verbose_name="")
name_working = models.CharField(verbose_name="")
type_izm = models.CharField(choices=TYPE_IZMERENIYA, verbose_name="")
value_work = models.FloatField(verbose_name="")
lyudi_norma = models.IntegerField(verbose_name="")
technik_norma = models.IntegerField(verbose_name="")
date_begin = models.DateField(verbose_name="")
date_end = models.DateField(verbose_name="")
views.py
фильтр_qs = CreateNewGPR.objects.filter(имя_объекта=pk) filter_qs = фильтруй_qs.значения("имено_работы", "тип_изм_работы", "значение_работы", "люди_нормы", "техники_нормы", "дата_начинания", "дата_окончания")
контекст['книги'] = filter_qs
template.html
<div>
<table class="pure-table">
<thead>
<tr>
<th>Name Column 1</th>
<th>Name Column 2</th>
<th>Name Column 3</th>
<th>Name Column 4</th>
<th>Name Column 5</th>
<th>Name Column 6</th>
<th>Name Column 7</th>
</tr>
</thead>
<tbody>
{% for book in books %}
<tr>
<td>{{ book.name_working }}</td>
<td>{{ book.type_izm }}</td>
<td>{{ book.value_work }}</td>
<td>{{ book.lyudi_norma }}</td>
<td>{{ book.technik_norma }}</td>
<td>{{ book.date_begin }}</td>
<td>{{ book.date_end }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
Просто укажите это в своем коде, если вы уверены, что всегда будет только одна страница с несколькими объектами:
def get_context_data(self, **kwargs) -> dict[str, typing.Any]:
context = super().get_context_data()
categories = collections.defaultdict(list)
for object in self.get_queryset():
categories[object.category].append(object)
context["categories"] = categories
return context
А затем отрендерьте его в шаблоне (вот пример html, заполните его в шаблоне самостоятельно):
<table>
<thead>
<tr>
<th>col1</th>
<th>col2</th>
<th>col3</th>
</tr>
</thead>
<tbody>
<tr>
<th colspan="3">category 1</th>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<th colspan="3">category 2</th>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>2</td>
</tr>
</tbody>
</table>
🧩 1. Обновите views.py, чтобы сгруппировать данные по категориям
python
Скопировано отредактировано
from collections import defaultdict
def your_view(request, pk):
# Get all objects for a specific `name_object`
filter_qs = CreateNewGPR.objects.filter(name_object=pk)
# Group by category
grouped_data = defaultdict(list)
for item in filter_qs:
grouped_data[item.name_category].append(item)
context = {
'grouped_data': grouped_data.items() # returns list of (category, items)
}
return render(request, 'your_template.html', context)
<время работы/>
🖼️ 2. Обновите template.html, чтобы отобразить сгруппированные разделы
html
Скопировано отредактировано
<table class="pure-table">
<thead>
<tr>
<th>Name Working</th>
<th>Type</th>
<th>Value</th>
<th>Lyudi Norma</th>
<th>Technik Norma</th>
<th>Start Date</th>
<th>End Date</th>
</tr>
</thead>
<tbody>
{% for category, items in grouped_data %}
<!-- Category Row -->
<tr style="background-color:#f0f0f0; font-weight:bold;">
<td colspan="7">Category: {{ category }}</td>
</tr>
{% for item in items %}
<tr>
<td>{{ item.name_working }}</td>
<td>{{ item.type_izm }}</td>
<td>{{ item.value_work }}</td>
<td>{{ item.lyudi_norma }}</td>
<td>{{ item.technik_norma }}</td>
<td>{{ item.date_begin }}</td>
<td>{{ item.date_end }}</td>
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
Это отобразит вашу таблицу, сгруппированную по name_category, с динамически вставляемыми заголовками разделов — нет необходимости вручную создавать “транзитную” модель или добавлять дополнительные строки.
🔁 Бонус: Сортировка по name_category
Если вы хотите, чтобы разделы отображались в определенном порядке:
filter_qs = CreateNewGPR.objects.filter(name_object=pk).order_by('имя_категории', 'имя_работы')