Класс DayArchiveView
Класс DayArchiveView применяется для отображения архива объектов,
отфильтрованных по конкретному дню. Он наследуется от BaseDateArchiveView
и предоставляет готовый механизм для работы с датами в URL. Основные
параметры класса включают queryset или model для указания
источника данных, date_field для задания поля с датой,
paginate_by для постраничной навигации и template_name
для шаблона. Класс автоматически извлекает год, месяц и день из URL
и формирует выборку объектов за указанную дату.
Синтаксис
from django.views.generic.dates import DayArchiveView
class MyDayArchiveView(DayArchiveView):
model = MyModel
date_field = "created_at"
allow_empty = False
paginate_by = 10
template_name = "myapp/day_archive.html"
Параметры класса
Основные атрибуты для настройки DayArchiveView:
-
model- модель, объекты которой будут отображаться -
queryset- кастомный набор объектов вместо всей модели -
date_field- поле модели, содержащее дату (обязательно) -
allow_empty- разрешать ли пустой список объектов -
paginate_by- количество объектов на странице -
template_name- путь к шаблону для отображения
Контекстные переменные
В шаблон передаются следующие переменные:
-
object_list- список объектов за указанный день -
day- объект даты (datetime.date) -
previous_day- предыдущий день с данными -
next_day- следующий день с данными
Пример . Использование
Создадим представление для отображения статей за определенный день:
from django.views.generic.dates import DayArchiveView
from myapp.models import Article
class ArticleDayArchiveView(DayArchiveView):
model = Article
date_field = "published_at"
allow_empty = True
paginate_by = 5
template_name = "myapp/day_archive.html"
context_object_name = "articles"
Пример . Шаблон
Шаблон для отображения архива за день:
<h1>Статьи за {{ day|date:"d.m.Y" }}</h1>
{% for article in articles %}
<h2>{{ article.title }}</h2>
<p>{{ article.content|truncatewords:30 }}</p>
<p>Опубликовано: {{ article.published_at|date:"H:i" }}</p>
{% empty %}
<p>Нет статей за этот день.</p>
{% endfor %}
<div class="pagination">
{% if previous_day %}
<a href="{% url 'day_archive' previous_day.year previous_day.month previous_day.day %}">
← {{ previous_day|date:"d.m.Y" }}
</a>
{% endif %}
{% if next_day %}
<a href="{% url 'day_archive' next_day.year next_day.month next_day.day %}">
{{ next_day|date:"d.m.Y" }} →
</a>
{% endif %}
</div>
Пример . URL-маршрут
Настройка маршрута для представления:
from django.urls import path
from myapp.views import ArticleDayArchiveView
urlpatterns = [
path(
"articles/<int:year>/<int:month>/<int:day>/",
ArticleDayArchiveView.as_view(),
name="day_archive"
),
]
Пример . С кастомным QuerySet
Фильтрация только опубликованных статей:
from django.views.generic.dates import DayArchiveView
from myapp.models import Article
class PublishedDayArchiveView(DayArchiveView):
queryset = Article.objects.filter(status="published")
date_field = "published_at"
paginate_by = 10
template_name = "myapp/day_archive.html"
Пример . С переопределением метода get_queryset
Динамическая фильтрация объектов:
from django.views.generic.dates import DayArchiveView
from myapp.models import Article
class CustomDayArchiveView(DayArchiveView):
model = Article
date_field = "published_at"
paginate_by = 5
def get_queryset(self):
qs = super().get_queryset()
return qs.filter(category__name="django")
Пример . Использование в шаблоне
Полный пример шаблона с навигацией:
{% extends "base.html" %}
{% block content %}
<h1>Архив за {{ day|date:"l, d.m.Y" }}</h1>
<div class="articles">
{% for article in articles %}
<article>
<h2><a href="{% url 'article_detail' article.id %}">{{ article.title }}</a></h2>
<p>{{ article.content|truncatewords:50 }}</p>
<small>{{ article.published_at|timesince }} назад</small>
</article>
{% empty %}
<p>Нет статей за {{ day|date:"d.m.Y" }}</p>
{% endfor %}
</div>
<div class="pagination">
{% if previous_day %}
<a href="{% url 'day_archive' previous_day.year previous_day.month previous_day.day %}">
← {{ previous_day|date:"d.m.Y" }}
</a>
{% endif %}
<span>{{ day|date:"d.m.Y" }}</span>
{% if next_day %}
<a href="{% url 'day_archive' next_day.year next_day.month next_day.day %}">
{{ next_day|date:"d.m.Y" }} →
</a>
{% endif %}
</div>
<div class="page-nav">
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">Предыдущая</a>
{% endif %}
<span>Страница {{ page_obj.number }} из {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">Следующая</a>
{% endif %}
</div>
{% endblock %}
Смотрите также
-
класс
ArchiveIndexView,
который отображает архив всех объектов -
класс
YearArchiveView,
который отображает архив за год -
класс
MonthArchiveView,
который отображает архив за месяц -
класс
DateDetailView,
который отображает детали объекта за конкретную дату