РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
322 of 818 menu

Класс YearArchiveView

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

Синтаксис

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

Пример

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

from 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-конфигурация для этого представления:

from django.urls import path from myapp.views import ArticleYearArchiveView urlpatterns = [ path( "articles/<int:year>/", ArticleYearArchiveView.as_view(), name="article_archive_year" ), ]

Пример

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

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

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

<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 и настроим порядок сортировки:

from 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

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

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

from 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

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

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

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

"2026" "2025" "2024"

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

  • класс ArchiveIndexView,
    который отображает список всех объектов с датами
  • класс MonthArchiveView,
    который отображает объекты за определенный месяц
  • класс DayArchiveView,
    который отображает объекты за определенный день
  • класс DateDetailView,
    который отображает один объект по дате
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить