Класс TodayArchiveView

Класс TodayArchiveView применяется для создания страницы архива, отображающей объекты модели, относящиеся к сегодняшней дате. Он наследуется от BaseDateArchiveView и автоматически определяет текущую дату для фильтрации. Класс позволяет настроить модель, поле с датой, шаблон и контекстные переменные. Также можно указать параметр allow_empty для управления отображением при отсутствии записей.

Синтаксис

pythonfrom 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:

pythonfrom 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 для вывода сегодняшних статей:

pythonfrom 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:

pythonfrom django.urls import path
from .views import ArticleTodayArchiveView

urlpatterns = [
  path("today/", ArticleTodayArchiveView.as_view(), name="article_today_archive"),
]

При переходе по адресу /today/ отобразятся все статьи, дата публикации которых совпадает с сегодняшним днём.

Пример

Класс позволяет использовать кастомный queryset с дополнительной фильтрацией, например, отображать только опубликованные записи, у которых поле is_published равно True:

pythonfrom 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 для добавления дополнительных данных в контекст шаблона. Например, передадим количество сегодняшних записей:

pythonfrom 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,
    который показывает объекты за определённый месяц