Класс DateDetailView
Класс DateDetailView применяется для отображения конкретной записи модели, при этом дата объекта извлекается из URL-параметров (год, месяц, день). Это позволяет показывать детали объекта, привязанного к конкретной дате. Класс наследуется от DetailView и добавляет фильтрацию по дате с использованием параметров year, month и day, переданных в URL.
Основные атрибуты класса: model - модель, с которой работает представление; template_name - шаблон для отображения; date_field - поле модели, содержащее дату (обязательно для фильтрации); context_object_name - имя переменной контекста для объекта. Также можно указать slug_field и slug_url_kwarg для идентификации объекта по слагу, если требуется.
Синтаксис
Базовое использование в файле 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'),
]
Определение класса представления в 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'
Пример
Рассмотрим базовый пример с моделью Article, имеющей поля published_date (дата публикации) и slug (уникальный идентификатор). Создадим представление, которое отображает статью по году, месяцу, дню и слагу:
# 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. Это может понадобиться, если требуется ограничить выборку, например, только опубликованными статьями:
from 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.
Результат выполнения кода при запросе к существующей статье:
"Article object: Django Tutorial"
Пример
Переопределим метод get_context_data для добавления дополнительных данных в контекст шаблона, например, списка комментариев к статье:
from 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, содержащая все комментарии к текущей статье. Это позволяет расширить функциональность без изменения основной логики отбора объекта по дате.
Результат выполнения кода в контексте представления:
{
'article': <Article: Django Tutorial>,
'comments': [<Comment: Great post>, <Comment: Very helpful>]
}
Смотрите также
-
класс
DetailView,
базовый класс для отображения одного объекта без привязки к дате -
класс
YearArchiveView,
отображение списка объектов за определенный год -
класс
MonthArchiveView,
отображение списка объектов за определенный месяц -
класс
DayArchiveView,
отображение списка объектов за определенный день