В этой статье мы разберём как сделать пагинацию на 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, и как вы возможно заметили тут всё очень просто, думаю вы разобрались, и вам было интересно.