【发布时间】:2009-08-20 18:59:43
【问题描述】:
我有这些模型:
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
仲夏
通知 1 中的文本 Lorem ipsum ...
通知 2 中的文本 Lorem ipsum ...
九月
- 通知 3 中的文本 Lorem ipsum ...
1950
一月
- 通知 4 中的文本 Lorem ipsum ...
等等
我通过遍历所有行来构建嵌套列表找到了一个解决方案,如下所示:
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)
但这是缓慢且不雅的。这样做的好方法是什么?
如果我可以在模板中设置一些变量,我只能遍历所有通知,并且仅通过检查它们是否与前一个相同来打印年份和期间。但是不能在模板中设置一些临时变量。
【问题讨论】: