Обобщённые представления для работы с датами
Обобщённые представления, основанные на датах и предоставляемые в 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.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseArchiveIndexViewdjango.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.views.generic.base.View
Контекст
Помимо контекста, предоставляемого
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.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseYearArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.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.
Примечания
- Использует значение
_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.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseMonthArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.MonthMixindjango.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.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.
Примечания
- Использует значение
_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.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseWeekArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.WeekMixindjango.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.views.generic.base.View
Контекст
Помимо контекста, предоставляемого
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. -
'%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, не всегда совпадают с номерами, вычисляемыми функциямиstrftime()иstrptime()со строкой формата'%W'. Например, для 2015 года номера недель, выведенные с помощьюdate, на единицу больше номеров, выведенных с помощьюstrftime(). Вdateнет эквивалента строки формата'%U'дляstrftime(). Поэтому для создания URL-адресов дляWeekArchiveViewне следует использоватьdate.
DayArchiveView
-
class DayArchiveView[исходный код] -
Страница архива за день, показывающая все объекты за указанный день. Для будущих дней возвращается ошибка 404 независимо от того, существуют ли объекты за эти дни, если не установить
allow_futureвTrue.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseDayArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.MonthMixindjango.views.generic.dates.DayMixindjango.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.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.
Примечания
- Использует значение
_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[исходный код] -
Страница архива за день, показывающая все объекты за сегодня. Она точно такая же, как
django.views.generic.dates.DayArchiveView, за исключением того, что вместо аргументовyear/month/dayиспользуется сегодняшняя дата.Предки (MRO)
django.views.generic.list.MultipleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseTodayArchiveViewdjango.views.generic.dates.BaseDayArchiveViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.MonthMixindjango.views.generic.dates.DayMixindjango.views.generic.dates.BaseDateListViewdjango.views.generic.list.MultipleObjectMixindjango.views.generic.dates.DateMixindjango.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.SingleObjectTemplateResponseMixindjango.views.generic.base.TemplateResponseMixindjango.views.generic.dates.BaseDateDetailViewdjango.views.generic.dates.YearMixindjango.views.generic.dates.MonthMixindjango.views.generic.dates.DayMixindjango.views.generic.dates.DateMixindjango.views.generic.detail.BaseDetailViewdjango.views.generic.detail.SingleObjectMixindjango.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[исходный код]
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/class-based-views/generic-date-based/