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

ArchiveIndexView

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

Синтаксис

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

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

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

  • model - модель, для которой строится архив
  • queryset - кастомный набор записей
  • date_field - название поля с датой (обязательно)
  • template_name - имя шаблона для рендеринга
  • paginate_by - количество записей на странице
  • allow_empty - разрешить отображение пустого списка (по умолчанию True)
  • context_object_name - имя переменной с объектами в шаблоне
  • ordering - порядок сортировки (по умолчанию "-date_field")

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

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

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

from 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

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

from 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 (список годов с записями):

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

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

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

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

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

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

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

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

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