Вступление
В этой статье описывается процесс создания пагинатора используя Django и HTMX. А в качестве UI-библиотеки - daisyUI. Это будет простой и без изысков пагинатор, необходимый минимум для работы. Так же в этой статье не будет описываться процесс создания и настройки виртуального окружения, и установки всех сопутствующих пакетов и модулей.

Вот так, на примере моего нового сайта будут выглядеть кнопки пагинации
Так же, данная статья является лишь одной из трёх статей про создание собственного пагинатора на Django. В этой, я лишь создам базу, основу, на которой мы доведём данный пагинатор до логического завершения. Во второй, мы добавим фильтры и сортировку. В третьей, добавим поле поиска. Итак, приступим.
Пишем фронтенд
Я предпочитаю начинать свою работу с фронтенда, а там как пойдёт ┐(シ)┌. Для начала, нам потребуется страница для размещения пагинатора и шаблоны для отрисовки загружаемого контента. Например, у меня есть домашняя страница, мне нужно вставить и подключить следующий шаблон.
Не так важно во что ты обернёшь подключаемый шаблон. Я вот, собираюсь подгружать статьи и хочу чтобы они все были в столбик, но не слишком широкий. Важно то, что нужно передать переменную articles в подключаемый шаблон parts/article-simple-paginator.html. Откуда её взять, смотри в следующей главе, сейчас разберём другие составляющие наших шаблонов.
Исходный код parts/article-simple-paginator.html:
Данный сниппет кода представляет собой флекс-бокс в колонку, для карточек статей и собственно кнопок пагинатора. Когда мы подключаем шаблон для отрисовки карточек статей, мы так же не забываем отправить туда articles переменную. После чего подключаем и пагинатор.
Теперь, собственно говоря, про пагинатор и его кнопки, шаблон parts/paginator-buttons.html:
Данный пагинатор реализован как форма с возможностью отправлять сразу несколько запросов. И отличаются эти запросы только номером следующей страницы. В самом начале я передаю csrf_token и несколько инпутов, они пока не нужны, но в следующей статье мы их дополним для реализации фильтрации и сортировки.
Он, пагинатор, состоит из 4-х кнопок и одной неактивной кнопки для показа текущей страницы пагинации и сколько ещё осталось. И вот как ведут себя эти кнопки:
- Кнопки >> и << отправляют на последнюю и первую страницу соответственно. Если пользователь уже на последней или первой странице, то эти кнопки отключаются.
- Кнопки > и < отправляют на следующую и предыдущую страницу соответственно. Если пользователь уже на последней или первой странице, то эти кнопки отключаются
Кнопки << < и >> имеют значение в атрибуте hx-target="#search-results", то есть корневой элемент отображения статей и пагинатора. При нажатии весь узел заменяется, а не дополняется новыми статьями так, как в случае с кнопкой >
На этом фронтенд часть завершена. Подводя итог, тебе нужны следующие шаблоны:
- parts/article-cards.html - для отрисовки карточек товаров
- parts/article-simple-paginator.html - комбинирует список карточек товаров и кнопки пагинации
- parts/paginator-buttons.html - интерфейс для управления пагинацией
- Место, куда можно было бы вставить parts/article-simple-paginator.html.
Пишем бэкенд
Перед тем как приступить к созданию бэкенда для пагинатора нужно обговорить несколько деталей. В частности, почему я не буду использовать REST API для пагинации.
Это решение, на самом деле, продиктовано необходимостью моего сайта иметь пагинатор на главной странице, а не на отдельном разделе сайта, как это сделано уже на этом сайте. Плюс, я хочу чтобы у людей была возможность сохранять в закладках необходимые им страницы пагинации.
Вот содержимое views.py файла, где находится представление для домашней страницы.
Данное представление создано в виде класса ибо, это удобно. И работает оно с двумя запросами, POST и GET. Различие их в том, куда они отрисовывают страницы пагинации. Если при GET запросе отрисовывается целая страница, то при POST запросе только необходимая часть, уже ранее известный тебе parts/article-simple-paginator.html шаблон.
Метод fetch инкапсулирует общую логику между запросами GET и POST. В следующей статье мы расширим этот метод и добавим фильтрацию с сортировкой, ну а пока подключим данное представление в urls.py:
Заключение
Не так уж и сложно на самом деле. Если, конечно, сравнивать это с тем, что мне пришлось написать для работы пагинатора на этом сайте. А чтобы его написать, пришлось писать огромное полотно JS-кода, и ещё больше кода для работы непосредственно кнопок пагинации.
Ещё больше пришлось его переписывать ( ; ω ; )
Так же, динамическая замена URL очень сильно упростила жизнь. Реализовать это на JS не сложно, но есть вещи, которые просто не хочется реализовывать своими силами.
И вот так просто, можно реализовать пагинатор на Django используя HTMX.