Общие представления даты¶
Общие представления на основе даты, представленные в 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
.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.dates.BaseArchiveIndexView
django.views.generic.dates.BaseDateListView
django.views.generic.list.MultipleObjectMixin
django.views.generic.dates.DateMixin
django.views.generic.base.View
Контекст
В дополнение к контексту, предоставляемому
django.views.generic.list.MultipleObjectMixin
(черезdjango.views.generic.dates.BaseDateListView
), контекст шаблона будет:date_list
: ОбъектQuerySet
, содержащий все годы, которые имеют доступные объекты согласноqueryset
, представленные как объектыdatetime.datetime
, в порядке убывания.
Примечания
- По умолчанию используется
context_object_name
по умолчаниюlatest
. - По умолчанию используется
template_name_suffix
по умолчанию_archive
. - По умолчанию предоставляет
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
.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.dates.BaseYearArchiveView
django.views.generic.dates.YearMixin
django.views.generic.dates.BaseDateListView
django.views.generic.list.MultipleObjectMixin
django.views.generic.dates.DateMixin
django.views.generic.base.View
-
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
.
Примечания
- По умолчанию используется
template_name_suffix
по умолчанию_archive_year
.
Пример 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
.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.dates.BaseMonthArchiveView
django.views.generic.dates.YearMixin
django.views.generic.dates.MonthMixin
django.views.generic.dates.BaseDateListView
django.views.generic.list.MultipleObjectMixin
django.views.generic.dates.DateMixin
django.views.generic.base.View
Контекст
В дополнение к контексту, предоставляемому
MultipleObjectMixin
(черезBaseDateListView
), контекст шаблона будет:date_list
: ОбъектQuerySet
, содержащий все дни, в которые имеются объекты в данном месяце, согласноqueryset
, представленные как объектыdatetime.datetime
, в порядке возрастания.month
: Объектdate
, представляющий данный месяц.next_month
: Объектdate
, представляющий первый день следующего месяца, согласноallow_empty
иallow_future
.previous_month
: Объектdate
, представляющий первый день предыдущего месяца, согласноallow_empty
иallow_future
.
Примечания
- По умолчанию используется
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
[исходный код]¶ Страница еженедельного архива, показывающая все объекты за определенную неделю. Объекты с датой в будущем не отображаются, если вы не установите
allow_future
вTrue
.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.dates.BaseWeekArchiveView
django.views.generic.dates.YearMixin
django.views.generic.dates.WeekMixin
django.views.generic.dates.BaseDateListView
django.views.generic.list.MultipleObjectMixin
django.views.generic.dates.DateMixin
django.views.generic.base.View
Контекст
В дополнение к контексту, предоставляемому
MultipleObjectMixin
(черезBaseDateListView
), контекст шаблона будет:week
: Объектdate
, представляющий первый день данной недели.next_week
: Объектdate
, представляющий первый день следующей недели, согласноallow_empty
иallow_future
.previous_week
: Объектdate
, представляющий первый день предыдущей недели, согласноallow_empty
иallow_future
.
Примечания
- По умолчанию используется
template_name_suffix
по умолчанию_archive_week
. - Атрибут
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>
В этом примере вы выводите номер недели. Следует помнить, что номера недель, вычисленные фильтром шаблона
date
с символом формата'W'
, не всегда совпадают с номерами недель, вычисленными фильтрамиstrftime()
иstrptime()
с символом формата'%W'
. Например, для 2015 года номера недель, выводимые фильтромdate
, больше на единицу по сравнению с номерами недель, выводимыми фильтромstrftime()
. Для форматной строки'%U'
strftime()
вdate
нет эквивалента. Поэтому следует избегать использованияdate
для генерации URL дляWeekArchiveView
.
DayArchiveView
¶
-
class
DayArchiveView
[исходный код]¶ Страница дневного архива, показывающая все объекты за данный день. Дни в будущем вызывают ошибку 404, независимо от того, существуют ли какие-либо объекты для будущих дней, если только вы не установите
allow_future
вTrue
.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.dates.BaseDayArchiveView
django.views.generic.dates.YearMixin
django.views.generic.dates.MonthMixin
django.views.generic.dates.DayMixin
django.views.generic.dates.BaseDateListView
django.views.generic.list.MultipleObjectMixin
django.views.generic.dates.DateMixin
django.views.generic.base.View
Контекст
В дополнение к контексту, предоставляемому
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
.
Примечания
- По умолчанию используется
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
[исходный код]¶ Страница дневного архива, показывающая все объекты за сегодня. Это в точности то же самое, что и
django.views.generic.dates.DayArchiveView
, только вместо аргументовyear
/month
/day
используется сегодняшняя дата.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.dates.BaseTodayArchiveView
django.views.generic.dates.BaseDayArchiveView
django.views.generic.dates.YearMixin
django.views.generic.dates.MonthMixin
django.views.generic.dates.DayMixin
django.views.generic.dates.BaseDateListView
django.views.generic.list.MultipleObjectMixin
django.views.generic.dates.DateMixin
django.views.generic.base.View
Примечания
- По умолчанию используется
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
[исходный код]¶ Страница, представляющая отдельный объект. Если объект имеет значение даты в будущем, представление по умолчанию будет выбрасывать ошибку 404, если только вы не установите
allow_future
вTrue
.Предки (MRO)
django.views.generic.detail.SingleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.dates.BaseDateDetailView
django.views.generic.dates.YearMixin
django.views.generic.dates.MonthMixin
django.views.generic.dates.DayMixin
django.views.generic.dates.DateMixin
django.views.generic.detail.BaseDetailView
django.views.generic.detail.SingleObjectMixin
django.views.generic.base.View
Контекст
- Включает единственный объект, связанный с
model
, указанным вDateDetailView
.
Примечания
- По умолчанию используется
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
):
-
class
BaseArchiveIndexView
[исходный код]¶
-
class
BaseYearArchiveView
[исходный код]¶
-
class
BaseMonthArchiveView
[исходный код]¶
-
class
BaseWeekArchiveView
[исходный код]¶
-
class
BaseDayArchiveView
[исходный код]¶
-
class
BaseTodayArchiveView
[исходный код]¶
-
class
BaseDateDetailView
[исходный код]¶