Класс TodayArchiveView
Класс TodayArchiveView применяется для создания страницы архива,
отображающей объекты модели, относящиеся к сегодняшней дате.
Он наследуется от BaseDateArchiveView и автоматически определяет
текущую дату для фильтрации. Класс позволяет настроить модель,
поле с датой, шаблон и контекстные переменные. Также можно указать
параметр allow_empty для управления отображением при отсутствии
записей.
Синтаксис
from django.views.generic.dates import TodayArchiveView
class MyTodayArchiveView(TodayArchiveView):
model = MyModel
date_field = "created_at"
template_name = "myapp/today_archive.html"
context_object_name = "today_objects"
allow_empty = True
Пример
Давайте создадим представление, которое выводит список статей,
опубликованных сегодня. Модель Article имеет поле pub_date
типа DateTimeField:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
А это представление, которое использует TodayArchiveView
для вывода сегодняшних статей:
from django.views.generic.dates import TodayArchiveView
from .models import Article
class ArticleTodayArchiveView(TodayArchiveView):
model = Article
date_field = "pub_date"
template_name = "articles/today_archive.html"
context_object_name = "today_articles"
allow_empty = True
Теперь добавим маршрут в urls.py:
from django.urls import path
from .views import ArticleTodayArchiveView
urlpatterns = [
path("today/", ArticleTodayArchiveView.as_view(), name="article_today_archive"),
]
При переходе по адресу /today/ отобразятся все статьи,
дата публикации которых совпадает с сегодняшним днём.
Пример
Класс позволяет использовать кастомный queryset с дополнительной
фильтрацией, например, отображать только опубликованные записи,
у которых поле is_published равно True:
from django.views.generic.dates import TodayArchiveView
from .models import Article
class PublishedTodayArchiveView(TodayArchiveView):
model = Article
date_field = "pub_date"
template_name = "articles/published_today.html"
context_object_name = "published_today"
allow_empty = False
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(is_published=True)
Этот код вернёт только те сегодняшние статьи,
у которых is_published равно True.
Если таких записей нет, а allow_empty установлен в False,
будет вызвана ошибка Http404.
Пример
Также можно переопределить метод get_context_data для добавления
дополнительных данных в контекст шаблона. Например, передадим
количество сегодняшних записей:
from django.views.generic.dates import TodayArchiveView
from .models import Article
class ArticleTodayArchiveView(TodayArchiveView):
model = Article
date_field = "pub_date"
template_name = "articles/today_archive.html"
context_object_name = "today_articles"
allow_empty = True
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["today_count"] = self.get_queryset().count()
return context
Теперь в шаблоне доступна переменная today_count, содержащая
количество записей за сегодня. Это позволяет выводить информацию
вроде «Сегодня опубликовано 5 статей».
Смотрите также
-
класс
ArchiveIndexView,
который отображает список всех объектов с датами в обратном порядке -
класс
YearArchiveView,
который выводит объекты за конкретный год -
класс
DayArchiveView,
который отображает объекты за выбранный день -
класс
MonthArchiveView,
который показывает объекты за определённый месяц