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

Атрибут 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,
    задает имя переменной в шаблоне
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить