Общие представления даты¶
Общие представления на основе даты, представленные в django.views.generic.dates, представляют собой представления для отображения страниц детализации для данных на основе даты.
Примечание
В некоторых примерах на этой странице предполагается, что модель «Статья» определена в «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.Классы-предки, Ancestors (MRO)
Контекст(Context)
В дополнение к контексту, предоставляемому
django.views.generic.list.MultipleObjectMixin(черезdjango.views.generic.dates.BaseDateListView), контекст шаблона будет:date_list: объектQuerySet, содержащий все годы, для которых есть объекты, доступные в соответствии сqueryset, представленные как объектыdatetime.datetime, в порядке убывания.
Примечания
По умолчанию используется
context_object_namelatest.По умолчанию используется
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.Классы-предки, Ancestors (MRO)
- make_object_list¶
Логическое значение, указывающее, следует ли получить полный список объектов за этот год и передать его в шаблон. Если
True, список объектов будет доступен контексту. Если установлено значение False, в качестве списка объектов будет использоваться набор запросов None. По умолчанию это значение «False».
- get_make_object_list()¶
Определите, будет ли возвращен список объектов как часть контекста. По умолчанию возвращает
make_object_list.
Контекст(Context)
В дополнение к контексту, предоставляемому
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.Классы-предки, Ancestors (MRO)
Контекст(Context)
В дополнение к контексту, предоставляемому
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.Классы-предки, Ancestors (MRO)
Контекст(Context)
В дополнение к контексту, предоставляемому
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.'%V': номер недели по ISO 8601, где неделя начинается в понедельник.New in Django 3.2:Support for the
'%V'week format was added.
Пример 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.Классы-предки, Ancestors (MRO)
Контекст(Context)
В дополнение к контексту, предоставляемому
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используется сегодняшняя дата.Классы-предки, Ancestors (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¶
Страница, представляющая отдельный объект. Если объект имеет значение даты в будущем, представление по умолчанию выдаст ошибку 404, если только вы не установите для
allow_futureзначениеTrue.Классы-предки, Ancestors (MRO)
Контекст(Context)
Включает единственный объект, связанный с моделью, указанной в 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¶