Класс DayArchiveView

Класс DayArchiveView применяется для отображения архива объектов, отфильтрованных по конкретному дню. Он наследуется от BaseDateArchiveView и предоставляет готовый механизм для работы с датами в URL. Основные параметры класса включают queryset или model для указания источника данных, date_field для задания поля с датой, paginate_by для постраничной навигации и template_name для шаблона. Класс автоматически извлекает год, месяц и день из URL и формирует выборку объектов за указанную дату.

Синтаксис

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

Контекстные переменные

В шаблон передаются следующие переменные:

Пример . Использование

Создадим представление для отображения статей за определенный день:

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

Пример . Шаблон

Шаблон для отображения архива за день:

ninja<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-маршрут

Настройка маршрута для представления:

pythonfrom 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

Фильтрация только опубликованных статей:

pythonfrom 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

Динамическая фильтрация объектов:

pythonfrom 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")

Пример . Использование в шаблоне

Полный пример шаблона с навигацией:

ninja{% 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,
    который отображает детали объекта за конкретную дату