ArchiveIndexView

Класс ArchiveIndexView применяется для создания страниц архивов, где записи упорядочены по дате (обычно по полю date_field). Он наследуется от ListView и добавляет возможность работы с датами. Обязательный атрибут - date_field, который указывает на поле модели с датой. По умолчанию записи выводятся в обратном порядке (самые новые сверху). Для работы класса необходимо определить модель или указать queryset, а также задать имя шаблона (template_name) или использовать шаблон по умолчанию. В контекст шаблона передаются переменные: latest - список объектов, date_list - список доступных годов.

Синтаксис

pythonclass MyArchiveView(ArchiveIndexView):
  model = MyModel
  date_field = "created_at"
  template_name = "archive.html"
  paginate_by = 10

Атрибуты класса

Основные атрибуты, которые можно задать:

Пример . Использование

Создадим класс для отображения архива статей по полю "published_at":

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

class ArticleArchiveView(ArchiveIndexView):
  model = Article
  date_field = "published_at"
  template_name = "article_archive.html"
  paginate_by = 5
  context_object_name = "articles"

Пример . С кастомным queryset

Можно отфильтровать записи с помощью get_queryset:

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

class PublishedArchiveView(ArchiveIndexView):
  date_field = "published_at"
  template_name = "published_archive.html"
  context_object_name = "posts"
  paginate_by = 10

  def get_queryset(self):
    return Article.objects.filter(status="published")

Переопределение get_context_data

Добавим дополнительные данные в контекст:

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

class CustomArchiveView(ArchiveIndexView):
  model = Article
  date_field = "created_at"
  template_name = "custom_archive.html"
  paginate_by = 20

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["total_count"] = self.get_queryset().count()
    return context

Пример . Работа в шаблоне

В шаблоне доступны переменные articles (список объектов) и date_list (список годов с записями):

html<h1>Архив статей</h1>
<ul>
  {% for article in articles %}
    <li>
      <a href="/articles/{{ article.slug }}/">
        {{ article.title }}
      </a> - {{ article.published_at|date:"d.m.Y" }}
    </li>
  {% empty %}
    <li>Нет записей в архиве.</li>
  {% endfor %}
</ul>

<div class="pagination">
  {% if page_obj.has_previous %}
    <a href="?page={{ page_obj.previous_page_number }}">Назад</a>
  {% endif %}
  {% if page_obj.has_next %}
    <a href="?page={{ page_obj.next_page_number }}">Вперёд</a>
  {% endif %}
</div>

Пример . Вывод date_list

Переменная date_list содержит список годов с записями:

html<ul>
  {% for year in date_list %}
    <li>
      <a href="/archive/{{ year|date:"Y" }}/">
        {{ year|date:"Y" }}
      </a>
    </li>
  {% endfor %}
</ul>

Результат запроса в консоли

Выведем список статей из архива с помощью print в консоли:

pythonfrom myapp.views import ArticleArchiveView
from django.core.management import call_command

view = ArticleArchiveView()
view.setup(request=None)
queryset = view.get_queryset()
for article in queryset[:5]:
  print(article.title)

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

python"Новая статья"
"Обновление Django"
"Архивные записи"
"Полезные советы"
"История версий"

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

  • класс ListView,
    базовый класс для вывода списка объектов
  • класс YearArchiveView,
    для отображения архива по годам
  • класс MonthArchiveView,
    для вывода записей за конкретный месяц
  • класс DetailView,
    для отображения отдельной записи