我使用 YearArchiveView
与我创建的应用程序一起显示每年的所有评论:
class year_reviews(YearArchiveView):
queryset = SimpleReview.objects.published()
date_field = "date_published"
make_object_list = True
allow_future = False
template_name = 'reviews.html'
context_object_name = 'reviews'
该视图工作正常 - 它会正确返回网址中指定的年份的所有评论,不会显示未来的评论,只会显示已发布的评论。
在呈现页面的顶部,我希望列出包含评论的所有年份,以便用户可以轻松转到不同年份的评论。 YearArchiveView
会自动向模板提供next_year
和previous_year
个上下文变量,但我无法找到任何可用年份的列表。 date_list
看起来很有希望,但只返回所选年份内月的列表。
有没有办法获取视图可以显示的所有年份的列表,以便在视图的页面之间提供导航?
答案 0 :(得分:2)
是的 - dates
查询集可以执行此操作:
https://docs.djangoproject.com/en/dev/ref/models/querysets/#dates
通用视图中的任何内容看起来都不会运行此类查询,因此您可能希望将其放在get_context_data
方法中。
你会想要这样的东西:
class YearReviews(YearArchiveView):
def get_context_data(self, **kwargs):
context = super(YearReviews, self).get_context_data(**kwargs)
context['years_available'] = self.queryset.dates(self.date_field, 'year')
return context
这会将datetime.date
个对象的查询集放入您的上下文中,代表每个有效年份的1月1日。如果您愿意,可以在get_context_data
方法中将它们转换为年份字符串,或者在模板中使用|date
过滤器。它会忽略您的allow_future
设置 - 如果您实时确定发布日期,这可能不是什么大问题。