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,
для отображения отдельной записи