通用日期视图¶
基于日期的通用视图,位于 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
)。