通用日期视图¶
基于日期的通用视图(在 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
[源代码]¶ 按照日期显示“最新”对象的顶级索引页。除非将
allow_future
设置为True
,否则不包括 future 中包含日期的对象。祖先(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.conf.urls import url from django.views.generic.dates import ArchiveIndexView from myapp.models import Article urlpatterns = [ url(r'^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
[源代码]¶ 一个年度归档页面,显示给定年份中的所有可用月份。除非将
allow_future
设置为True
,否则不会显示在 future 中具有日期的对象。祖先(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
:表示下一年第一天的date
对象,根据allow_empty
和allow_future
。previous_year
:表示上一年第一天的date
对象,根据allow_empty
和allow_future
。
笔记
使用
_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.conf.urls import url from myapp.views import ArticleYearArchiveView urlpatterns = [ url(r'^(?P<year>[0-9]{4})/$', 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
[源代码]¶ 显示给定月份中所有对象的月度归档页面。除非将
allow_future
设置为True
,否则不会显示在 future 中具有日期的对象。祖先(MRO)
上下文
除了由
MultipleObjectMixin
(通过BaseDateListView
)提供的上下文,模板的上下文将是:date_list
:根据queryset
,包含在给定月份中具有可用对象的所有天的QuerySet
对象,以升序表示为datetime.datetime
对象。month
:表示给定月份的date
对象。next_month
:表示下个月第一天的date
对象,根据allow_empty
和allow_future
。previous_month
:表示前一个月第一天的date
对象,根据allow_empty
和allow_future
。
笔记
使用
_archive_month
的默认template_name_suffix
。
示例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.conf.urls import url from myapp.views import ArticleMonthArchiveView urlpatterns = [ # Example: /2012/aug/ url(r'^(?P<year>[0-9]{4})/(?P<month>[-\w]+)/$', ArticleMonthArchiveView.as_view(), name="archive_month"), # Example: /2012/08/ url(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]+)/$', ArticleMonthArchiveView.as_view(month_format='%m'), name="archive_month_numeric"), ]
示例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
[源代码]¶ 显示给定周内所有对象的每周归档页面。除非将
allow_future
设置为True
,否则不会显示在 future 中具有日期的对象。祖先(MRO)
上下文
除了由
MultipleObjectMixin
(通过BaseDateListView
)提供的上下文,模板的上下文将是:week
:表示给定周的第一天的date
对象。next_week
:表示下周第一天的date
对象,根据allow_empty
和allow_future
。previous_week
:表示前一周第一天的date
对象,根据allow_empty
和allow_future
。
笔记
使用
_archive_week
的默认template_name_suffix
。week_format
属性是用于解析星期编号的strptime()
格式字符串。支持以下值:'%U'
:基于美国周系统,其中一周从星期日开始。这是默认值。'%W'
:类似于'%U'
,除了它假定一周从星期一开始。这与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.conf.urls import url from myapp.views import ArticleWeekArchiveView urlpatterns = [ # Example: /2012/week/23/ url(r'^(?P<year>[0-9]{4})/week/(?P<week>[0-9]+)/$', 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()
输出的周数高1。在date
中没有'%U'
strftime()
格式字符串的等效项。因此,您应避免使用date
为WeekArchiveView
生成网址。
DayArchiveView
¶
-
class
DayArchiveView
[源代码]¶ 显示指定日期内所有对象的日期归档页面。未来几天会出现404错误,而不管以后是否存在任何对象,除非您将
allow_future
设置为True
。祖先(MRO)
上下文
除了由
MultipleObjectMixin
(通过BaseDateListView
)提供的上下文,模板的上下文将是:day
:表示给定日期的date
对象。next_day
:表示第二天的date
对象,根据allow_empty
和allow_future
。previous_day
:表示前一天的date
对象,根据allow_empty
和allow_future
。next_month
:表示下个月第一天的date
对象,根据allow_empty
和allow_future
。previous_month
:表示前一个月第一天的date
对象,根据allow_empty
和allow_future
。
笔记
使用
_archive_day
的默认template_name_suffix
。
示例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.conf.urls import url from myapp.views import ArticleDayArchiveView urlpatterns = [ # Example: /2012/nov/10/ url(r'^(?P<year>[0-9]{4})/(?P<month>[-\w]+)/(?P<day>[0-9]+)/$', 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
[源代码]¶ 显示 today 的所有对象的日归档页面。这与
django.views.generic.dates.DayArchiveView
完全相同,除了使用今天的日期而不是year
/month
/day
参数。祖先(MRO)
笔记
使用
_archive_today
的默认template_name_suffix
。
示例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.conf.urls import url from myapp.views import ArticleTodayArchiveView urlpatterns = [ url(r'^today/$', ArticleTodayArchiveView.as_view(), name="archive_today"), ]
TodayArchiveView
的示例模板在哪里?此视图默认使用与
DayArchiveView
相同的模板,在上一个示例中。如果需要不同的模板,请将template_name
属性设置为新模板的名称。
DateDetailView
¶
-
class
DateDetailView
[源代码]¶ 表示单个对象的页面。如果对象在未来有日期值,视图将默认抛出404错误,除非您将
allow_future
设置为True
。祖先(MRO)
django.views.generic.detail.SingleObjectTemplateResponseMixin
django.views.generic.detail.BaseDetailView
上下文
包括与
DateDetailView
中指定的model
关联的单个对象。
笔记
使用
_detail
的默认template_name_suffix
。
示例myapp/urls.py:
from django.conf.urls import url from django.views.generic.dates import DateDetailView urlpatterns = [ url(r'^(?P<year>[0-9]{4})/(?P<month>[-\w]+)/(?P<day>[0-9]+)/(?P<pk>[0-9]+)/$', 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
):