Атрибут paginate_by
Атрибут paginate_by класса ListView определяет количество объектов,
которые будут отображаться на одной странице списка. При указании этого
атрибута Django автоматически разбивает набор объектов на страницы и
передает в шаблон объект page_obj, который содержит информацию о
текущей странице, соседних страницах и количестве всех объектов.
Значение атрибута должно быть целым положительным числом.
Синтаксис
class MyListView(ListView):
model = MyModel
paginate_by = 10
Пример
Рассмотрим простой пример использования атрибута paginate_by
для отображения статей по 5 штук на странице:
from django.views.generic import ListView
from myapp.models import Article
class ArticleListView(ListView):
model = Article
paginate_by = 5
template_name = 'articles/list.html'
context_object_name = 'articles'
В этом примере при переходе на страницу списка статей, Django автоматически
разобьет все статьи на страницы по 5 записей на каждой. В шаблоне доступен
объект page_obj, который позволяет навигировать по страницам.
Пример
Пример использования paginate_by вместе с кастомным запросом:
from django.views.generic import ListView
from myapp.models import Article
class PublishedArticleListView(ListView):
queryset = Article.objects.filter(status='published')
paginate_by = 10
context_object_name = 'articles'
template_name = 'articles/published_list.html'
В данном случае будут отображаться только опубликованные статьи, разбитые по 10 штук на страницу.
Пример
Использование динамического значения для атрибута paginate_by
с переопределением метода get_paginate_by:
from django.views.generic import ListView
from myapp.models import Article
class DynamicArticleListView(ListView):
model = Article
paginate_by = 10
template_name = 'articles/dynamic_list.html'
def get_paginate_by(self, queryset):
# Используем значение из GET-параметра или значение по умолчанию
per_page = self.request.GET.get('per_page', 10)
try:
return int(per_page)
except ValueError:
return self.paginate_by
Теперь пользователь может указать количество статей на странице через
GET-параметр 'per_page', например,
'http://example.com/articles/?per_page=20'.
Пример
Полный пример использования paginate_by с кастомным контекстом:
from django.views.generic import ListView
from myapp.models import Article
class FullArticleListView(ListView):
model = Article
paginate_by = 15
context_object_name = 'articles'
template_name = 'articles/full_list.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Добавляем дополнительную информацию о пагинации
context['total_articles'] = self.get_queryset().count()
context['current_page'] = self.request.GET.get('page', 1)
return context
В этом примере в шаблон передается не только объект page_obj,
но и дополнительная информация об общем количестве статей и номере
текущей страницы.
Смотрите также
-
класс
ListView,
базовый класс для отображения списка объектов -
атрибут
model,
определяет модель для отображения -
атрибут
queryset,
задает кастомный набор объектов -
атрибут
context_object_name,
задает имя переменной в шаблоне