Класс MonthArchiveView
Класс MonthArchiveView применяется для создания страниц архива,
которые показывают все объекты, относящиеся к конкретному месяцу
и году. Он наследуется от BaseArchiveView и предоставляет
удобный способ фильтрации объектов по дате с разбивкой по месяцам.
Основные параметры конфигурации: queryset или model
для указания набора объектов, date_field для указания поля
с датой и template_name для шаблона.
Синтаксис
from django.views.generic.dates import MonthArchiveView
from myapp.models import Article
class ArticleMonthArchiveView(MonthArchiveView):
model = Article
date_field = "created_at"
month_format = "%m"
template_name = "articles/month_archive.html"
context_object_name = "article_list"
paginate_by = 10
Пример
Создадим представление для отображения статей за определенный месяц:
from django.views.generic.dates import MonthArchiveView
from myapp.models import Article
class ArticleMonthArchiveView(MonthArchiveView):
model = Article
date_field = "published_at"
year_format = "%Y"
month_format = "%m"
template_name = "articles/month_archive.html"
context_object_name = "articles"
paginate_by = 5
Пример
Добавим URL маршрут для нашего представления:
from django.urls import path
from myapp.views import ArticleMonthArchiveView
urlpatterns = [
path(
"articles/<int:year>/<int:month>/",
ArticleMonthArchiveView.as_view(),
name="article_month_archive"
),
]
Пример
Теперь перейдем по URL '/articles/2026/09/' и получим список статей,
опубликованных в сентябре 2026 года. В шаблоне мы можем использовать
переданные переменные:
<h1>Articles for {{ month|date:"F Y" }}</h1>
<ul>
{% for article in articles %}
<li>{{ article.title }} - {{ article.published_at|date:"d.m.Y" }}</li>
{% empty %}
<li>No articles for this month.</li>
{% endfor %}
</ul>
<p>Previous month: {{ previous_month }}</p>
<p>Next month: {{ next_month }}</p>
Пример
Используем кастомный queryset для фильтрации только опубликованных статей:
from django.views.generic.dates import MonthArchiveView
from myapp.models import Article
class PublishedMonthArchiveView(MonthArchiveView):
model = Article
date_field = "published_at"
year_format = "%Y"
month_format = "%m"
template_name = "articles/month_archive.html"
context_object_name = "articles"
allow_empty = False
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(status="published")
Результат выполнения кода:
[<Article: Django Basics>, <Article: Advanced Models>, <Article: Views in Django>]
Пример
Настроим представление с дополнительными параметрами для более гибкого отображения:
from django.views.generic.dates import MonthArchiveView
from myapp.models import Article
class CustomMonthArchiveView(MonthArchiveView):
queryset = Article.objects.filter(status="published")
date_field = "published_at"
month_format = "%m"
year_format = "%Y"
template_name = "articles/custom_month_archive.html"
context_object_name = "items"
paginate_by = 15
allow_future = False
allow_empty = True
template_name_suffix = "_archive"
Смотрите также
-
класс
ArchiveIndexView,
который создает индексный архив -
класс
YearArchiveView,
который отображает архив по годам -
класс
DayArchiveView,
который отображает архив по дням -
класс
DateDetailView,
который отображает конкретный объект по дате