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

标签 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'

该 View 工作正常 - 它正确返回 URL 中指定年份的所有评论,不显示 future 的评论,只显示已发布的评论。

在渲染页面的顶部,我希望有一个包含评论的所有年份的列表,以便用户可以轻松地移动到不同年份的评论。 YearArchiveView 自动向模板提供 next_yearprevious_year 上下文变量,但我找不到任何可用年份的列表。 date_list 看起来很有希望,但只返回所选年份内月份的列表。

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

最佳答案

是的 - 日期查询集可以做到这一点:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#dates

看起来通用 View 中的任何内容都没有运行此类查询,因此您可能需要将其放入 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 设置 - 如果您基于实时发布日期,这可能不是什么大问题。

关于python - Django YearArchiveView 可以返回所有可能年份的列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20714778/

相关文章:

python - Django 表单在刷新时再次提交

python - 如何使用 Django 循环标签

python - 类中的方法可以是生成器吗?

python - Django 表单选择字段在渲染后为空

javascript - 使用 javascript 解析时间戳响应文件 (tsr)

python - Django 最佳实践 : How to clean and render a form

django-tastypie : Posting to a Resource having ManytoMany field with through relationship

python - 我的代码无法识别 `import sklearn`

django - 如何在 Django for 循环模板中获取奇数和偶数值?

django - 如何防止 Django 的响应框架剥离文本文件的换行符?