2

我使用YearArchiveView与我创建显示在页面上,从每年的全部评论的应用程序:Django 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看起来很有前途,但只在选定年份内返回个月的列表。

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

回答

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设置 - 如果您要实时制作出版日期,这可能不是什么大问题。

+0

我刚刚开始学习基于类的视图,所以我对'get_context_data'很熟悉,但我会研究这个,看看是否有方法可以将自定义查询集绑定到该类。谢谢。 – nhinkle

+0

编辑更多一点细节。 –

+1

我给了这样一个尝试,但因为我的'date_published'是一个DateTimeField而不是一个DateField,我遇到了一个错误([#21432](https://code.djangoproject.com/ticket/21432))当试图在查询集上使用'datetimes()'方法时会导致错误。这个bug已经修复了,但是它并不在我使用的Django 1.6(production)中,所以我不能真正测试这个,直到我找出解决这个bug的方法。感谢您的帮助 - 我会在修复问题后进行更新。 – nhinkle

相关问题