Django 的 YearArchiveView 通用日期视图

Django's YearArchiveView generic date view

在 Django 中有一个名为 YearArchiveView that has an attribute called make_object_list 的通用视图。

有人可以向我解释为什么这个选项实际上存在吗?

如果我想要一个基于年份的查询集,那么很明显我需要一个对象列表,即使它只有一个对象,这不符合逻辑吗? 还是我理解错了。

TLDR; make_object_list returns object_list 下视图上下文中给定 YearArchiveView 的所有对象.默认情况下 make_object_list 为 False,这将导致 returned 上下文 object_list 为空。

所以 django documentation is a little tricky to understand on this part. But hopefully this helps (tip: looking at the source code 真的很有帮助)。

YearArchiveView 默认情况下 return 在以下上下文中:

  • date_list:一个日期查询集 return 包含其中包含对象的所有月份。
  • year:给定年份的日期对象。
  • next_year: 下一年第一天的日期对象。
  • previous_year: 前一年第一天的日期对象。

您会注意到在此列表中,给定年份的查询集对象 returned 是空的。

make_object_list 因此,从上面我们知道,默认情况下,上下文将 return 一些与对象日期、当前年份、上一个和下一个相关的值,但没有来自数据库的实际查询集对象。

在 YearArchiveView 中将 make_object_list 设置为 true,将导致给定年份的所有查询集对象通过上下文传回,以便在视图中使用它们。

在模板中,查询集对象将在上下文 object_list 下可用。

在给定 YearArchiveView 的模板中,您可以使用:

{% for item in object_list %}
    <strong>item.title</strong> - {{ item.date }}
{% endfor %}

除了@MattWritesCode 的回复之外,我想说的是,在某些用例中,您只对构建导航感兴趣,而不包括很多实际对象。

我想象处理 1000 篇文章,就像大报纸那样。我很可能想在一个单独的视图中显示实际内容,该视图支持分页(并且可能是细粒度的权限访问,例如 public posts 和 posts behind a paywall)。

问得好,我只是在猜测这个问题。由于查询集是惰性的,我不希望它能带来很大的性能提升,但也许在某种程度上这也是一个方面。会对更多关于它的意见感兴趣。