У меня есть тезисы моделей:
class Year(models.Model):
name = models.CharField(max_length=15)
date = models.DateField()
class Period(models.Model):
name = models.CharField(max_length=15)
date = models.DateField()
class Notice(models.Model):
year = models.ForeignKey(Year)
period = models.ForeignKey(Period, blank=True, null=True)
text = models.TextField()
order = models.PositiveSmallIntegerField(default=1)
И, на мой взгляд, я хотел бы показать все уведомления, упорядоченные по годам и периодам, но я не хочу повторять год и / или период для уведомления, если они совпадают с предыдущими. Я хотел бы получить такой результат:
1932-1940
Середина лета
Сентябрь
- Текст Lorem ipsum из уведомления 3 ...
1950
Январь
- Текст Lorem ipsum из уведомления 4 ...
и т.д.
Я нашел решение, перебрав все строки для создания вложенных списков, например:
years = [('1932-1940', [
('Mid-summer', [Notice1, Notice2]),
('September', [Notice3])
]),
('1950', [
('January', [Notice4])
])
]
Вот код в представлении:
years = []
year = []
period = []
prev_year = ''
prev_period = ''
for notice in Notice.objects.all():
if notice.year != prev_year:
prev_year = notice.year
year = []
years.append((prev_year.name, year))
prev_period = ''
if notice.periode != prev_period:
prev_period = notice.periode
period = []
if prev_period:
name = prev_period.name
else:
name = None
year.append((name, period))
period.append(notice)
Но это медленно и не элегантно. Какой хороший способ сделать это?
Если бы я мог установить некоторые переменные внутри шаблона, я мог бы перебирать только все уведомления и печатать только год и период, проверяя, совпадают ли они с предыдущим. Но невозможно установить некоторые временные переменные в шаблонах.