Класс 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,
который отображает один объект по дате