Django YearArchiveView可以返回所有可能年份的列表吗?

时间:2013-12-21 02:28:17

标签: python django django-templates django-views django-generic-views

我使用 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_yearprevious_year个上下文变量,但我无法找到任何可用年份的列表。 date_list看起来很有希望,但只返回所选年份内的列表。

有没有办法获取视图可以显示的所有年份的列表,以便在视图的页面之间提供导航?

1 个答案:

答案 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设置 - 如果您实时确定发布日期,这可能不是什么大问题。