Класс YearArchiveView

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

Синтаксис

pythonfrom django.views.generic.dates import YearArchiveView

class MyYearArchiveView(YearArchiveView):
  model = MyModel
  date_field = "created_at"
  template_name = "myapp/year_archive.html"
  context_object_name = "object_list"

Пример

Создадим представление для отображения статей, опубликованных в определенном году:

pythonfrom django.views.generic.dates import YearArchiveView
from myapp.models import Article

class ArticleYearArchiveView(YearArchiveView):
  model = Article
  date_field = "pub_date"
  template_name = "articles/year_archive.html"
  context_object_name = "articles"

URL-конфигурация для этого представления:

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

urlpatterns = [
  path(
    "articles/<int:year>/",
    ArticleYearArchiveView.as_view(),
    name="article_archive_year"
  ),
]

Пример

Используем queryset для фильтрации с дополнительными условиями. Покажем только опубликованные статьи за 2024 год:

pythonfrom django.views.generic.dates import YearArchiveView
from myapp.models import Article

class PublishedYearArchiveView(YearArchiveView):
  template_name = "articles/published_year_archive.html"
  date_field = "pub_date"
  context_object_name = "published_articles"
  
  def get_queryset(self):
    return Article.objects.filter(status="published")

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

html<h1>Архив статей за {{ year|date:"Y" }} год</h1>

<ul>
  {% for article in published_articles %}
    <li>{{ article.title }} - {{ article.pub_date|date:"d.m.Y" }}</li>
  {% empty %}
    <li>Нет статей за этот год</li>
  {% endfor %}
</ul>

<p>Всего статей: {{ published_articles|length }}</p>

Пример

Используем пагинацию для постраничного вывода статей. Укажем paginate_by и настроим порядок сортировки:

pythonfrom django.views.generic.dates import YearArchiveView
from myapp.models import Article

class PaginatedYearArchiveView(YearArchiveView):
  model = Article
  date_field = "pub_date"
  template_name = "articles/paginated_year_archive.html"
  context_object_name = "articles"
  paginate_by = 10
  ordering = "-pub_date"
  allow_empty = True
  
  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["year_title"] = self.kwargs.get("year")
    return context

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

html<h1>Архив за {{ year_title }} год</h1>
<ul>
  {% for article in articles %}
    <li>{{ article.title }}</li>
  {% endfor %}
</ul>
<div>
  <span>Страница {{ page_obj.number }} из {{ page_obj.paginator.num_pages }}</span>
</div>

Пример

Получим список годов, для которых есть статьи, используя метод get_year_list:

pythonfrom django.views.generic.dates import YearArchiveView
from myapp.models import Article

class YearListView(YearArchiveView):
  model = Article
  date_field = "pub_date"
  template_name = "articles/year_list.html"
  context_object_name = "articles"
  
  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["year_list"] = self.get_year_list()
    return context

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

html<h1>Список годов с публикациями</h1>
<ul>
  {% for year in year_list %}
    <li>
      <a href="{% url 'article_archive_year' year=year %}">
        {{ year }}
      </a>
    </li>
  {% empty %}
    <li>Нет публикаций</li>
  {% endfor %}
</ul>

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

python"2026"
"2025"
"2024"

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

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