Как я могу отобразить таблицу в шаблоне с дополнительными строками категорий/разделов?

Хорошего дня!

У меня есть нестандартная таблица. Которую я планирую отобразить в шаблоне.

Я загружаю таблицу в шаблон из модели. И у меня есть дополнительные разделы - дополнительные поля. Эти дополнительные поля характеризуют - Категорию, раздел, темы. Я думаю, как отобразить такую таблицу из модели в шаблоне - как показано на картинке.

Для дополнительной реализации дополнительных полей - категорий или разделов в таблице.

У меня есть приблизительное представление -

Я должен создать транзитную модель именно для такой таблицы - в которой количество строк равно количеству строк исходной таблицы + плюс количество строк разделов категорий в дополнение. То есть, в исходной таблице может быть около 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('имя_категории', 'имя_работы')

Вернуться на верх