通用日期视图 — Django 文档
通用日期视图
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.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
显示给定年份中所有可用月份的年度存档页面。 除非将
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
:根据 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
显示给定月份中所有对象的每月存档页面。 除非将
allow_future
设置为True
,否则不会显示日期在 future 中的对象。祖先 (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
对象。
笔记
使用
_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.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
显示给定周内所有对象的每周存档页面。 除非将
allow_future
设置为True
,否则不会显示日期在 future 中的对象。祖先 (MRO)
语境
除了 MultipleObjectMixin(通过 BaseDateListView)提供的上下文之外,模板的上下文将是:
week
:表示给定周的第一天的date
对象。next_week
:根据 allow_empty 和 allow_future,表示下周第一天的date
对象。previous_week
:根据 allow_empty 和 allow_future,代表上周第一天的date
对象。
笔记
使用
_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.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'
格式字符的 :tfilter:`date` 模板过滤器计算的周数并不总是与strftime()
和 [ X183X] 与'%W'
格式字符串。 例如,对于 2015 年,:tfilter:`date` 输出的周数比strftime()
输出的周数高 1。 :tfilter:`date` 中的'%U'
strftime()
格式字符串没有等效项。 因此,您应该避免使用 :tfilter:`date` 为WeekArchiveView
生成 URL。
DayArchiveView
- class DayArchiveView
一天存档页面,显示给定日期内的所有对象。 未来几天会抛出 404 错误,无论未来几天是否存在任何对象,除非您将
allow_future
设置为True
。祖先 (MRO)
语境
除了 MultipleObjectMixin(通过 BaseDateListView)提供的上下文之外,模板的上下文将是:
day
:代表给定日期的date
对象。next_day
:根据 allow_empty 和 allow_future,代表第二天的date
对象。previous_day
:代表前一天的date
对象,根据 allow_empty 和 allow_future。next_month
:根据 allow_empty 和 allow_future,表示下个月第一天的date
对象。previous_month
:根据 allow_empty 和 allow_future,表示上个月第一天的date
对象。
笔记
使用
_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.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
显示 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.urls import path from myapp.views import ArticleTodayArchiveView urlpatterns = [ path('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.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):
- class BaseArchiveIndexView
- class BaseYearArchiveView
- class BaseMonthArchiveView
- class BaseWeekArchiveView
- class BaseDayArchiveView
- class BaseTodayArchiveView
- class BaseDateDetailView