Класс MonthArchiveView

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

Синтаксис

pythonfrom 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

Пример

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

pythonfrom 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 маршрут для нашего представления:

pythonfrom 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 года. В шаблоне мы можем использовать переданные переменные:

ninja<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 для фильтрации только опубликованных статей:

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

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

python[<Article: Django Basics>, <Article: Advanced Models>, <Article: Views in Django>]

Пример

Настроим представление с дополнительными параметрами для более гибкого отображения:

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