通用日期视图¶
基于日期的通用视图,位于 django.views.generic.dates 中,用于显示基于日期数据的逐层页面。
注意
此页面上的一些示例假设 Article 模型已在 myapp/models.py 中定义如下:
from django.db import models
from django.urls import reverse
class Article(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateField()
def get_absolute_url(self):
return reverse("article-detail", kwargs={"pk": self.pk})
ArchiveIndexView¶
- class ArchiveIndexView[source]¶
显示“最新”对象的顶级索引页,按日期排序。除非将
allow_future设置为True,否则不会包含未来日期的对象。祖先 (MRO)
上下文
除了由
django.views.generic.list.MultipleObjectMixin(通过django.views.generic.dates.BaseDateListView)提供的上下文之外,模板的上下文将是date_list:一个包含根据queryset可用的所有年份的QuerySet对象,以datetime.datetime对象表示,按降序排列。
注释
使用
latest的默认context_object_name。使用
_archive的默认template_name_suffix。默认情况下按年份提供
date_list,但这可以使用属性date_list_period更改为月份或日期。这也适用于所有子类视图。
示例 myapp/urls.py:
from django.urls import path from django.views.generic.dates import ArchiveIndexView from myapp.models import Article urlpatterns = [ path( "archive/", ArchiveIndexView.as_view(model=Article, date_field="pub_date"), name="article_archive", ), ]
示例 myapp/article_archive.html:
<ul> {% for article in latest %} <li>{{ article.pub_date }}: {{ article.title }}</li> {% endfor %} </ul>
这将输出所有文章。
YearArchiveView¶
- class YearArchiveView[source]¶
年度归档页面,显示给定年份中所有可用的月份。除非将
allow_future设置为True,否则不会显示未来日期的对象。祖先 (MRO)
- make_object_list¶
一个布尔值,指定是否要检索该年的完整对象列表并将其传递给模板。如果为
True,则对象列表将提供给上下文。如果为False,则将使用None查询集作为对象列表。默认情况下,此值为False。
- get_make_object_list()¶
确定是否将对象列表作为上下文的一部分返回。默认情况下返回
make_object_list。
上下文
除了由
django.views.generic.list.MultipleObjectMixin(通过django.views.generic.dates.BaseDateListView)提供的上下文之外,模板的上下文将是date_list:一个包含根据queryset可用的所有月份的QuerySet对象,以datetime.datetime对象表示,按升序排列。year:一个表示给定年份的date对象。next_year:一个表示下一年第一天(根据allow_empty和allow_future)的date对象。previous_year:一个表示前一年第一天(根据allow_empty和allow_future)的date对象。
注释
使用
_archive_year的默认template_name_suffix。
示例 myapp/views.py:
from django.views.generic.dates import YearArchiveView from myapp.models import Article class ArticleYearArchiveView(YearArchiveView): queryset = Article.objects.all() date_field = "pub_date" make_object_list = True allow_future = True
示例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleYearArchiveView urlpatterns = [ path("<int:year>/", ArticleYearArchiveView.as_view(), name="article_year_archive"), ]
示例 myapp/article_archive_year.html:
<ul> {% for date in date_list %} <li>{{ date|date }}</li> {% endfor %} </ul> <div> <h1>All Articles for {{ year|date:"Y" }}</h1> {% for obj in object_list %} <p> {{ obj.title }} - {{ obj.pub_date|date:"F j, Y" }} </p> {% endfor %} </div>
MonthArchiveView¶
- class MonthArchiveView[source]¶
每月归档页面,显示给定月份中的所有对象。除非将
allow_future设置为True,否则不会显示未来日期的对象。祖先 (MRO)
上下文
除了由
MultipleObjectMixin(通过BaseDateListView)提供的上下文之外,模板的上下文将是date_list:一个包含根据queryset在给定月份中可用的所有日期的QuerySet对象,以datetime.datetime对象表示,按升序排列。month:一个表示给定月份的date对象。next_month:一个表示下一月份第一天(根据allow_empty和allow_future)的date对象。previous_month:根据allow_empty和allow_future,表示上个月第一天 的date对象。
注释
使用默认的
template_name_suffix为_archive_month。
示例 myapp/views.py:
from django.views.generic.dates import MonthArchiveView from myapp.models import Article class ArticleMonthArchiveView(MonthArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True
示例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleMonthArchiveView urlpatterns = [ # Example: /2012/08/ path( "<int:year>/<int:month>/", ArticleMonthArchiveView.as_view(month_format="%m"), name="archive_month_numeric", ), # Example: /2012/aug/ path( "<int:year>/<str:month>/", ArticleMonthArchiveView.as_view(), name="archive_month", ), ]
示例:myapp/article_archive_month.html:
<ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_month %} Previous Month: {{ previous_month|date:"F Y" }} {% endif %} {% if next_month %} Next Month: {{ next_month|date:"F Y" }} {% endif %} </p>
WeekArchiveView¶
- class WeekArchiveView[source]¶
每周归档页面,显示给定周内的所有对象。除非将
allow_future设置为True,否则不会显示日期在未来的对象。祖先 (MRO)
上下文
除了由
MultipleObjectMixin(通过BaseDateListView)提供的上下文之外,模板的上下文将是week:表示给定周的第一天的date对象。next_week:根据allow_empty和allow_future,表示下周的第一天的date对象。previous_week:根据allow_empty和allow_future,表示上周的第一天的date对象。
注释
使用默认的
template_name_suffix为_archive_week。week_format属性是一个用于解析周数的strptime()格式字符串。支持以下值:'%U':基于美国周系统,一周从周日开始。这是默认值。'%W':类似于'%U',但假设一周从周一开始。这与 ISO 8601 周数不同。'%V':ISO 8601 周数,一周从周一开始。
示例 myapp/views.py:
from django.views.generic.dates import WeekArchiveView from myapp.models import Article class ArticleWeekArchiveView(WeekArchiveView): queryset = Article.objects.all() date_field = "pub_date" week_format = "%W" allow_future = True
示例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleWeekArchiveView urlpatterns = [ # Example: /2012/week/23/ path( "<int:year>/week/<int:week>/", ArticleWeekArchiveView.as_view(), name="archive_week", ), ]
示例:myapp/article_archive_week.html:
<h1>Week {{ week|date:'W' }}</h1> <ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_week %} Previous Week: {{ previous_week|date:"W" }} of year {{ previous_week|date:"Y" }} {% endif %} {% if previous_week and next_week %}--{% endif %} {% if next_week %} Next week: {{ next_week|date:"W" }} of year {{ next_week|date:"Y" }} {% endif %} </p>
在这个例子中,您正在输出周数。请记住,使用
'W'格式字符的date模板过滤器计算的周数并不总是与使用'%W'格式字符串的strftime()和strptime()计算的周数相同。例如,在2015年,date输出的周数比strftime()输出的周数高一位。date中没有与'%U'strftime()格式字符串等效的字符串。因此,您应该避免使用date生成WeekArchiveView的URL。
DayArchiveView¶
- class DayArchiveView[source]¶
每日归档页面,显示给定日期的所有对象。未来的日期会抛出 404 错误,无论未来日期是否存在任何对象,除非您将
allow_future设置为True。祖先 (MRO)
上下文
除了由
MultipleObjectMixin(通过BaseDateListView)提供的上下文之外,模板的上下文将是day:表示给定日期的date对象。next_day:根据allow_empty和allow_future,表示下一天的date对象。previous_day:根据allow_empty和allow_future,表示前一天的date对象。next_month:一个表示下一月份第一天(根据allow_empty和allow_future)的date对象。previous_month:根据allow_empty和allow_future,表示上个月第一天 的date对象。
注释
使用默认的
template_name_suffix为_archive_day。
示例 myapp/views.py:
from django.views.generic.dates import DayArchiveView from myapp.models import Article class ArticleDayArchiveView(DayArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True
示例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleDayArchiveView urlpatterns = [ # Example: /2012/nov/10/ path( "<int:year>/<str:month>/<int:day>/", ArticleDayArchiveView.as_view(), name="archive_day", ), ]
示例:myapp/article_archive_day.html:
<h1>{{ day }}</h1> <ul> {% for article in object_list %} <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li> {% endfor %} </ul> <p> {% if previous_day %} Previous Day: {{ previous_day }} {% endif %} {% if previous_day and next_day %}--{% endif %} {% if next_day %} Next Day: {{ next_day }} {% endif %} </p>
TodayArchiveView¶
- class TodayArchiveView[source]¶
显示今天所有对象的每日归档页面。这与
django.views.generic.dates.DayArchiveView完全相同,只是使用今天的日期而不是year/month/day参数。祖先 (MRO)
注释
使用默认的
template_name_suffix为_archive_today。
示例 myapp/views.py:
from django.views.generic.dates import TodayArchiveView from myapp.models import Article class ArticleTodayArchiveView(TodayArchiveView): queryset = Article.objects.all() date_field = "pub_date" allow_future = True
示例 myapp/urls.py:
from django.urls import path from myapp.views import ArticleTodayArchiveView urlpatterns = [ path("today/", ArticleTodayArchiveView.as_view(), name="archive_today"), ]
TodayArchiveView的示例模板在哪里?默认情况下,此视图使用与上一个示例中的
DayArchiveView相同的模板。如果您需要不同的模板,请将template_name属性设置为新模板的名称。
DateDetailView¶
- class DateDetailView[source]¶
表示单个对象的页面。如果对象的日期值在未来,则视图默认会抛出 404 错误,除非您将
allow_future设置为True。祖先 (MRO)
上下文
包含与
DateDetailView中指定的model关联的单个对象。
注释
使用默认的
template_name_suffix为_detail。
示例 myapp/urls.py:
from django.urls import path from django.views.generic.dates import DateDetailView urlpatterns = [ path( "<int:year>/<str:month>/<int:day>/<int:pk>/", DateDetailView.as_view(model=Article, date_field="pub_date"), name="archive_date_detail", ), ]
例如 myapp/article_detail.html:
<h1>{{ object.title }}</h1>
注意
上面列出的所有通用视图都具有匹配的 Base 视图,它们的区别仅仅在于它们不包含 MultipleObjectTemplateResponseMixin(对于存档视图)或 SingleObjectTemplateResponseMixin(对于 DateDetailView)。