【问题标题】:Can a Django YearArchiveView return a list of all possible years?Django YearArchiveView 可以返回所有可能年份的列表吗?
【发布时间】:2014-01-09 23:22:56
【问题描述】:

我将 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'

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

在呈现页面的顶部,我想列出所有年份的评论,以便用户可以轻松地转到不同年份的评论。 YearArchiveView 自动为模板提供 next_yearprevious_year 上下文变量,但我找不到任何可用年份的列表。 date_list 看起来很有希望,但只返回所选年份内的 列表。

有没有什么方法可以获取视图可以显示的所有年份的列表,从而为视图提供页面之间的导航?

【问题讨论】:

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


    【解决方案1】:

    是的 - 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 设置 - 如果您基于实时发布日期,这可能没什么大不了的。

    【讨论】:

    • 我刚开始学习基于类的视图,所以我对get_context_data 很熟悉,但我会研究一下,看看是否有办法可以绑定自定义查询集与此同在。谢谢。
    • 编辑得更详细一点。
    • 我尝试过这样的事情,但是因为我的 date_published 是 DateTimeField 而不是 DateField,所以我遇到了一个错误 (#21432),它在尝试使用datetimes() 查询集上的方法。该错误已得到修复,但它不在我正在使用的 Django 1.6(生产)中,所以在我找到解决该错误的方法之前,我无法真正测试它。感谢您的帮助 - 一旦我解决了这个问题,我会更新。
    • 看起来该错误修复已进入我刚刚安装的 Django 1.6.1 中,并且可以正常工作!再次感谢。
    • 很高兴听到这个消息——我实际上并没有使用过最近的 Django 版本。顺便说一句,找到官方错误报告绝对是正确的举措。
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2012-04-14
    • 2021-07-02
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多