Повысьте эффективность и масштабируемость вашего приложения Django, внедрив разбиение на страницы. Вот все, что вам нужно знать, чтобы начать.

Разбиение на страницы улучшает взаимодействие с пользователем и производительность приложений при работе с большими наборами данных. Без системы разбивки на страницы ваше приложение большую часть времени будет отставать. С Django вы можете использовать встроенную поддержку нумерации страниц для разбиения вашего веб-приложения на страницы.

Как работает пагинация в Django

Реализация нумерации страниц в Django может различаться в зависимости от того, работаете ли вы с представлениями на основе классов или функций. Независимо от выбранного вами метода, основные принципы остаются теми же.

Django использует класс с именем Пагинатор реализовать пагинацию. Пагинатор Класс предоставляет несколько методов, которые можно использовать для настройки разбивки на страницы. При инициализации Пагинатор class, он принимает два обязательных параметра; данные для разбиения на страницы и количество элементов, отображаемых на странице.

instagram viewer
Пагинатор принимает третий необязательный параметр для сирот, чтобы указать минимальное количество элементов, которые должны оставаться на последней странице. По умолчанию значение orphans равно 0, что означает, что все страницы имеют одинаковое количество элементов.

URL-адрес страницы с разбивкой на страницы Django выглядит примерно так: https://example.com/products/?page=3. страница Параметр в URL сообщает Django, какую страницу хочет видеть пользователь. Это также помогает Django определить, какую часть данных отображать на этой странице.

Код, используемый в этом проекте, доступен в Репозиторий GitHub и вы можете использовать его бесплатно по лицензии MIT.

Настройте свой проект Django для разбивки на страницы

Прежде чем разбивать страницы в Django, вы должны иметь установил Django и настроил его на свой компьютер. После настройки Django на вашем компьютере вы должны создать приложение и модель для своих данных. Вот простая модель, которую вы можете скопировать:

от django.db Импортировать модели

сортПочта(модели. Модель):

название = модели. CharField (max_length=255)
автор = модели. CharField (max_length=50)
контент = модели. Текстовое поле(«Опубликовать контент»)

деф__str__(себя):
возвращаться собственное название

Приведенная выше модель предназначена для приложения блога. Он определяет поля заголовка, автора и контента для каждого поста в блоге. У него также есть метод, который возвращает заголовок сообщения для лучшего взаимодействия с пользователем в панели администратора.

Перенесите свою модель, выполнив эту команду:

python manage.py makemigrations && python manage.py migrate

После переноса вашей модели вы должны перейти к блог>admin.py зарегистрировать его. Следующий код успешно регистрирует модель с именем Почта.

от django.contrib Импортировать администратор
от .модели Импортировать Почта # замените «Post» на название вашей модели

admin.site.register (Пост)

Затем создайте суперпользователя и добавьте сообщения в панель администратора Django. Чтобы создать суперпользователя, используйте эту команду:

python manage.py создает суперпользователя

Приведенная выше команда проведет вас через процесс, показанный на изображении ниже:

После создания суперпользователя запустите сервер разработки и перейдите в панель администратора.

сервер запуска python manage.py

Как только ваш сервер запустится, перейдите к http://127.0.0.1:8000/admin, авторизуйтесь и добавьте несколько сообщений.

Затем создайте шаблон HTML для отображения ваших сообщений в браузере. Создайте свой файл в следующем каталоге: ваше_приложение/шаблоны/имя_вашего_приложения/index.html. Если вы не понимаете, как создавать шаблоны, прочитайте нашу вводное руководство по архитектуре Django MVT.

Django Pagination в функциональном представлении

Django позволяет создавать приложения либо с представлениями на основе классов, либо с представлениями на основе функций. Чтобы разбить ваше приложение на страницы с помощью представления на основе функций. Следуй этим шагам:

  • Откройте свой просмотры.py файл и импортировать Пагинатор сорт.
от django.core.paginator Импортировать Пагинатор
  • Создайте функцию просмотра для отображения сообщений в вашем HTML-шаблоне.
от django.shortcuts Импортировать оказывать
от .модели Импортировать Почта
от django.core.paginator Импортировать Пагинатор

дефПосмотреть список(запрос):
сообщения = Post.objects.all()
возвращаться оказывать (запрос, 'блог/blog_list_view.html', {'сообщения':посты})

  • Создайте шаблон URL для отображения ваших сообщений в браузере. Начните с настройки шаблона URL в каталоге вашего проекта. Открой urls.py файл на уровне проекта и добавьте его в URL-шаблоны:
от django.urls Импортировать включать

URL-шаблоны = [
...,
путь('', включать('блог.urls')),
]

В приведенном выше фрагменте кода замените блог с названием вашего приложения. Если вы не можете отличить проект от приложения, вы должны знать чем проект отличается от приложения в Django.

После выполнения описанной выше конфигурации создайте urls.py файл в каталоге вашего приложения (в данном случае это блог папку) и добавьте этот фрагмент кода:

от django.urls Импортировать путь
от .Просмотры Импортировать Посмотреть список

URL-шаблоны = [
путь('', list_view, имя ='Посмотреть список'),
]

Когда вы запускаете свой сервер и переходите к http://127.0.0.1:8000/, браузер отобразит ваши сообщения в соответствии с указанной вами таблицей стилей.

  • Измените функцию просмотра, чтобы добавить логику разбивки на страницы. Вот пример:
дефПосмотреть список(запрос):
сообщения = Post.objects.all()
paginated = Paginator (сообщения, 3)
номер_страницы = запрос. ПОЛУЧИТЬ.получить('страница') #Получить запрошенный номер страницы из URL

страница = paginated.get_page (номер_страницы)
возвращаться оказывать (запрос, 'блог/blog_list_view.html', {'страница':страница})

В приведенном выше фрагменте кода представлены три новые переменные: разбитый на страницы, номер страницы, и страница. Каждая переменная делает следующее:

  1. разбитый на страницы переменная инициализировала Пагинатор сорт. В этом сценарии данные для разбиения на страницы представляют собой набор запросов, сообщения, и это занимает 3 как количество элементов, отображаемых на странице.
  2. номер страницы переменная получает номер страницы из URL. Например, в http://127.0.0.1:8000/?page=2, номер страницы 2.
  3. страница переменная извлекает конкретную страницу для отображения из разбитый на страницы переменная.

К настоящему времени Django, должно быть, разбил вашу страницу на страницы. Вы можете перейти к определенным страницам с разбивкой на страницы, используя формат URL, показанный на этом изображении:

  • Измените свой HTML-шаблон, чтобы отобразить навигацию для страниц с разбивкой на страницы. Используя методы, доступные в Пагинатор class позволяет вам создать простую навигацию на вашей странице. Вот пример, который вы можете добавить под исходным HTML-кодом:
 {% если page.has_previous%}
<аhref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">Предыдущийа>
{% конец%}

<аhref="?страница=1"сорт="бтн бтн-вторичный">Первыйа>

{% для числа в page.paginator.page_range %}
{% если число == страница.номер %}
<охватывать>{{число}}охватывать>
{% еще %}
<аhref="?страница={{число}}"сорт="бтн бтн-вторичный мх-2">
{{число}}
а>
{% конец%}
{% конец для %}

<аhref="?page={{page.paginator.num_pages}}"сорт="бтн бтн-вторичный мх-2">
Последний
а>

{% если page.has_next %}
<аhref="?page={{page.next_page_number}}"сорт="бтн бтн-вторичный мх-2">
Следующий
а>
{% конец%}

В приведенном выше фрагменте кода следующие методы используются в сочетании с условными операторами, чтобы определить, как будет выглядеть навигация по страницам:

  1. has_previous: этот метод возвращает Истинный если в разбивке на страницы есть предыдущая страница.
  2. предыдущая_страница_номер: этот метод возвращает значение предыдущей страницы.
  3. диапазон_страниц: этот метод позволяет узнать, сколько страниц у вас есть в данных с разбивкой на страницы.
  4. число: этот метод возвращает значение текущей страницы.
  5. num_pages: этот метод возвращает общее количество страниц.
  6. has_next: эта функция возвращает Истинный если в разбивке на страницы данных есть следующая страница.
  7. номер_следующей_страницы: этот метод возвращает значение следующей страницы.

Django Pagination в представлении на основе классов

В представлении на основе классов вам не нужно импортировать и инициализировать Пагинатор сорт. Чтобы реализовать разбиение на страницы в представлении на основе классов, вы должны указать атрибут с именем paginate_by. Выполните следующие действия, чтобы разбить приложение на страницы с представлением на основе классов:

  • Напишите представление на основе классов и укажите paginate_by атрибут. Вот простой пример:
от .модели Импортировать Почта
от django.views.generic Импортировать Посмотреть список

сортPostListView(Посмотреть список):
модель = Пост
имя_шаблона = 'блог/blog_list_view.html'
имя_объекта_контекста = 'страница'
paginate_by = 2

Приведенное выше представление представляет собой основанную на классах версию представления, основанного на функциях, написанного ранее. Это представление наследует Django Посмотреть список класс, используемый для перечисления элементов. Он определяет свою логику с помощью таких атрибутов, как модель, Имя Шаблона, context_object_name, и paginate_by. paginate_by атрибут определяет, сколько постов отображать на странице; в данном случае 2 сообщения.

  • Создав представление, измените urls.py файл, чтобы использовать его. Вот простой пример:
от .Просмотры Импортировать PostListView

URL-шаблоны = [
путь('', PostListView.as_view(), имя='Посмотреть список'),
]

  • Измените свой HTML-шаблон, чтобы использовать page_obj для пагинации.
 {% если page_obj.has_previous%}
<аhref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">Предыдущийа>
{% конец%}

<аhref="?страница=1"сорт="бтн бтн-вторичный">Первыйа>

{% для числа в page_obj.paginator.page_range %}
{% если число == page_obj.номер %}
<охватыватьсорт="текущая страница">{{число}}охватывать>
{% еще %}
<аhref="?страница={{число}}"сорт="бтн бтн-вторичный мх-2">
{{число}}
а>
{% конец%}
{% конец для %}

<аhref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-NN">
Последний
а>

{% если page.has_next %}
<аhref="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-NN">
Следующий
а>
{% конец%}

В отличие от шаблона HTML для функционального представления, этот шаблон использует page_obj вместо страница для представления объекта страницы. Это поведение по умолчанию для разбиения на страницы на основе классов в Django.

Используйте разбиение на страницы, чтобы сделать ваше приложение масштабируемым

Разбивка на страницы снижает нагрузку на ваш сервер/базу данных, извлекая и отображая меньшие подмножества данных за раз. С нумерацией страниц производительность ваших сайтов повысится. Ваши пользователи также будут иметь хороший опыт использования вашего приложения.

Представления на основе классов экономят больше времени и кода по сравнению с представлениями на основе функций, но вы можете использовать любой из них в зависимости от ваших предпочтений и спецификаций проекта.