Как в Django вывести в HTML отдельно "родителя" и "наследников"?
Требуется в таблицу HTML отдельно вывести "родителя" (тип прибора) и "наследников" (модификация прибора). Пока получется выводить все в один столбец - т.е. если у прибора указан "Тип", то выводится его тип, а если указана модификация, то выводится модификация (см. скриншот), как бы это разбить? P.S. Я не прогромист, а метролог.
models.py
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
class MPI(models.TextChoices):
NO = '-', ('нет')
SIX_MONTHS = '6', ('6 месяцев')
ONE_YEAR = '12', ('1 год')
EIGHTEEN_MONTHS = '18', ('1,5 года')
TWO_YEARS = '24', ('2 года')
THREE_YEAR = '36', ('3 года')
FOUR_YEAR = '48', ('4 года')
FIVE_YEAR = '60', ('5 лет')
SIX_YEAR = '72', ('6 лет')
class NumberReestr(models.Model):
"""
Модель НОМЕРОВ и НАИМЕНОВАНИЙ средств измерений по госреестру.
"""
registry_number = models.CharField(verbose_name='№ Госреестра', max_length=8, blank=True, null=True,
unique=True, error_messages={'unique': 'Повтор! Данные уже занесены'},
help_text='Введите № ГОСРЕЕСТРА')
title = models.TextField(verbose_name='Наименование прибора по госреестру', max_length=150, blank=True, null=True,
unique=True, error_messages={'unique': 'Повтор! Данные уже занесены'},
help_text='Введите согласно госреестру НАИМЕНОВАНИЕ ПРИБОРА')
def __str__(self):
return f"{self.registry_number} {self.title}"
class Meta:
verbose_name = 'Номер Реестра'
verbose_name_plural = 'Справочник Номера реестра'
class Type(MPTTModel):
tip = models.CharField(max_length=255, verbose_name="Тип/модификация прибора", unique=True, help_text='Введите согласно госреестру Тип СИ и сохраните его, если предусмотрены МОДИФИКАЦИИ, ' \
'повторно, в этоже поле, занесите название Модификации с указанием "РОДИТЕЛЬСКОГО" ТИПа', error_messages={'unique': 'Повтор! Данные уже занесены'})
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children', db_index=True, verbose_name="ссылка на родительский тип",
help_text='При вводе МОДИФИКАЦИИ сошлитесь из указанного списка на "РОДИТЕЛЬСКИЙ" ТИП')
class MPTTMeta:
# сортировка по полю
order_insertion_by = ['tip']
level_attr = '1'
class Meta:
verbose_name = "Тип и модификация"
verbose_name_plural = "Справочник Типы и модификации"
def __str__(self):
return self.tip
class Gosreestr(models.Model):
"""
Модель, представляющая сведения об утвержденных типах средств измерений.
"""
reestr = models.ForeignKey(NumberReestr, on_delete=models.CASCADE, blank=False, verbose_name='госреестр',
help_text='Выберите госреестр СИ',)
tip = models.ForeignKey(Type, verbose_name='Тип/Модиф.', on_delete=models.CASCADE, blank=False,
db_index=True, help_text='Выберите или занесите согласно госреестру ТИП/МОДИФ. СИ', related_name='gosreestrs',)
mpi = models.CharField(max_length=2, choices=MPI, verbose_name='межповерочный интервал', default=12)
description = models.TextField(max_length=150, verbose_name='Примечание (комментарий)', null=True, blank=True)
def __str__(self):
return f"{self.reestr} {self.tip} {self.mpi}"
class Meta:
verbose_name = 'Госреестр'
verbose_name_plural = 'Госреестры'
# это ограничение на уровне базы данных, которое позволяет гарантировать уникальность значений полей модели
# в базе данных. Оно гарантирует, что в базе данных не будет записей, в которых значения полей совпадают
constraints = [
models.UniqueConstraint(
fields=['reestr', 'tip', 'mpi'], name='unique_reestr'
)
]
class Pribor(models.Model):
"""Таблица КАРТОЧКА ПРИБОРА"""
grsi = models.ForeignKey(Gosreestr, verbose_name='ГРСИ', on_delete=models.CASCADE,
blank=False, db_index=True, related_name='pribors')
factory_number = models.CharField(verbose_name='Заводской номер', max_length=30, null=True, blank=True,
db_index=True)
def __str__(self):
return f"{self.pk} {self.grsi} {self.factory_number}"
class Meta:
verbose_name = 'Карточка прибора'
verbose_name_plural = 'Карточки приборов'
views.py
from django.shortcuts import render
from .models import *
def pribor_list(request):
pribors = Pribor.objects.order_by('grsi__reestr__title',
'grsi__tip__tip',
'-grsi__reestr__registry_number',)
context = {'pribors': pribors,}
return render(request, 'PriborList.html', context)
PriborList.html
<table class="table">
<thead>
<tr>
<th>№</th>
<th>№ ГРСИ</th>
<th>Наименование СИ</th>
<th>Тип</th>
<th>Модиф.</th>
<th>Заводской номер</th>
</tr>
</thead>
<tbody>
{% for pribor in pribors %}
<tr>
<!-- Текущая итерация цикла (начинается с индекса 1) - сквозная номерация -->
<td>{{ forloop.counter }}</td>
<!-- -->
<td>{{ pribor.grsi.reestr.registry_number }}</td>
<td>{{ pribor.grsi.reestr.title }}</td>
<!-- Получение родителя (тип прибора) -->
<td>{{node.tip}}</td>
<td>{{ pribor.grsi.tip }}</td>
<td>{{ pribor.factory_number }}</td>
</tr>
{% endfor %}
</tbody>
</table>