Класс DateDetailView

Класс DateDetailView применяется для отображения конкретной записи модели, при этом дата объекта извлекается из URL-параметров (год, месяц, день). Это позволяет показывать детали объекта, привязанного к конкретной дате. Класс наследуется от DetailView и добавляет фильтрацию по дате с использованием параметров year, month и day, переданных в URL.

Основные атрибуты класса: model - модель, с которой работает представление; template_name - шаблон для отображения; date_field - поле модели, содержащее дату (обязательно для фильтрации); context_object_name - имя переменной контекста для объекта. Также можно указать slug_field и slug_url_kwarg для идентификации объекта по слагу, если требуется.

Синтаксис

Базовое использование в файле urls.py:

pythonfrom django.urls import path
from myapp.views import ArticleDateDetailView

urlpatterns = [
  path('article/<int:year>/<int:month>/<int:day>/<slug:slug>/', ArticleDateDetailView.as_view(), name='article-detail'),
]

Определение класса представления в views.py:

pythonfrom django.views.generic import DateDetailView
from myapp.models import Article

class ArticleDateDetailView(DateDetailView):
  model = Article
  date_field = 'published_date'
  slug_field = 'slug'
  context_object_name = 'article'
  template_name = 'article_detail.html'

Пример

Рассмотрим базовый пример с моделью Article, имеющей поля published_date (дата публикации) и slug (уникальный идентификатор). Создадим представление, которое отображает статью по году, месяцу, дню и слагу:

python# models.py
from django.db import models

class Article(models.Model):
  title = models.CharField(max_length=100)
  content = models.TextField()
  published_date = models.DateTimeField()
  slug = models.SlugField(unique=True)

  def __str__(self):
    return self.title

# views.py
from django.views.generic import DateDetailView
from myapp.models import Article

class ArticleDateDetailView(DateDetailView):
  model = Article
  date_field = 'published_date'
  slug_field = 'slug'
  context_object_name = 'article'
  template_name = 'article_detail.html'

# urls.py
from django.urls import path
from myapp.views import ArticleDateDetailView

urlpatterns = [
  path('article/<int:year>/<int:month>/<int:day>/<slug:slug>/', ArticleDateDetailView.as_view(), name='article-detail'),
]

При обращении к URL /article/2026/9/7/django-tutorial/ представление автоматически найдет статью с датой публикации 7 сентября 2026 года и слагом 'django-tutorial'. Результат будет передан в шаблон как переменная article.

Пример

Использование DateDetailView с кастомной фильтрацией через переопределение метода get_queryset. Это может понадобиться, если требуется ограничить выборку, например, только опубликованными статьями:

pythonfrom django.views.generic import DateDetailView
from myapp.models import Article

class CustomArticleDateDetailView(DateDetailView):
  model = Article
  date_field = 'published_date'
  slug_field = 'slug'
  context_object_name = 'article'
  template_name = 'article_detail.html'

  def get_queryset(self):
    queryset = super().get_queryset()
    return queryset.filter(status='published')

Теперь представление будет отображать только те статьи, у которых поле 'status' равно 'published'. Если статья с заданной датой и слагом не найдена, будет выброшена ошибка Http404.

Результат выполнения кода при запросе к существующей статье:

python"Article object: Django Tutorial"

Пример

Переопределим метод get_context_data для добавления дополнительных данных в контекст шаблона, например, списка комментариев к статье:

pythonfrom django.views.generic import DateDetailView
from myapp.models import Article, Comment

class ArticleDateDetailView(DateDetailView):
  model = Article
  date_field = 'published_date'
  slug_field = 'slug'
  context_object_name = 'article'
  template_name = 'article_detail.html'

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    article = self.object
    context['comments'] = Comment.objects.filter(article=article)
    return context

Теперь в шаблоне доступна переменная comments, содержащая все комментарии к текущей статье. Это позволяет расширить функциональность без изменения основной логики отбора объекта по дате.

Результат выполнения кода в контексте представления:

python{
  'article': <Article: Django Tutorial>,
  'comments': [<Comment: Great post>, <Comment: Very helpful>]
}

Смотрите также

  • класс DetailView,
    базовый класс для отображения одного объекта без привязки к дате
  • класс YearArchiveView,
    отображение списка объектов за определенный год
  • класс MonthArchiveView,
    отображение списка объектов за определенный месяц
  • класс DayArchiveView,
    отображение списка объектов за определенный день