В этой статье мы разберём как сделать пагинацию на Python Django, думаю многим начинающим разработчикам будет полезно и интересно.
Также посмотрите статью «Шаблонизатор Django как с ним работать», тоже очень интересно.
Как сделать пагинацию в Django:
Для реализации пагинации в Django есть специальный встроенный модуль, благодаря ему создать её крайне просто, вот пример кода пагинация:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from .models import Post def index_page(request): posts = Post.objects.all().order_by('-id') if 'page' in request.GET: page = request.GET['page'] else: page = 1 paginator = Paginator(posts, 15) try: posts = paginator.page(page) except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) context = { 'posts': posts } return render(request, "pages/index.html", context) |
В начале мы портируем три модуля, это Paginator, PageNotAnInteger, и EmptyPage, первый будет отвечать за сам пагинацию, остальные два пригодиться для обработки ошибок.
После чего мы создаём функцию которая будет генерировать нам страницу, внутри её берём все посты которые у нас есть, потом проверяем GET запрос «page», в котором храним номер страницы, если есть, то присваиваем значение переменной, если же нет, то присваиваем переменной page один.
Следующие создаём пагинатор, с помощью функции Paginator(), первым значением мы передаём посты, вторым, сколько мы хотим видеть их на странице, дальше начинаем отлавливать ошибки, в начале проверяем PageNotAnInteger, то есть проверяем, целое число paginator.page, если нет, то присваиваем один, потом проверяем EmptyPage, оно вызывается если значение правильное, но для страницы нет элементов, если ошибка сработала, то с помощью paginator.num_pages, которая хранит количество страниц, назначаем последнею страницу.
Ну и последние мы добавляем все наши посты в контекст и рендерим страницу при вызове.
Теперь создаём шаблон для вывода пагинации, для этого в папке «templates» создаём файл «pagination.html» и вот что в нём пишем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | {% load static %} {% if posts.has_other_pages %} <nav id="pagination" class="col align-self-center" aria-label="Page navigation example"> <ul class="pagination"> {% if posts.has_previous %} <li class="page-item"><a class="page-link" href="?page={{ posts.previous_page_number }}">«</a></li> {% else %} <li class="page-item disabled"><span class="page-link" href="#" tabindex="-1" aria-disabled="true">«</span></li> {% endif %} {% for i in posts.paginator.page_range %} {% if i > posts.number|add:-4 and i < posts.number|add:4 %} {% if posts.number == i %} <li class="page-item active" aria-current="page"><a class="page-link" href="#">{{ i }} <span class="sr-only">(current)</span></a></li> {% else %} <li class="page-item"><a class="page-link" href="?page={{ i }}">{{ i }}</a></li> {% endif %} {% endif %} {% endfor %} {% if posts.has_next %} <li class="page-item"><a class="page-link" href="?page={{ posts.next_page_number }}">»</a></li> {% else %} <li class="page-item disabled"><span class="page-link" href="#" tabindex="-1" aria-disabled="true">»</span></li> {% endif %} </ul> </nav> {% endif %} |
Тут мы создали меню пагинации, также можете заметить, что мы используем Bootstrap, но это скорее не большое дополнение, в остальном, тут всё зависит от условий, советую вам самим посмотреть этот код, и проверить как он работает.
Последние что нам стоит сделать, чтобы всё заработало, так это вывести шаблон пагинации на страницу, вот как это будет выглядеть:
1 2 3 4 5 6 7 | ... <div class="container"> {% block pagination %} {% include 'pagination.html' %} {% endblock %} </div> |
Теперь можете запустить и убедиться что всё работает нормально.
Вывод:
В этой статье вы прочитали как сделать пагинацию на Python Django, и как вы возможно заметили тут всё очень просто, думаю вы разобрались, и вам было интересно.

