Пагинация. Когда не знаем сколько страниц будет
По долгу службы столкнулся с весьма тривиальной задачей.
В общем нужно было построить пагинацию для каталога, причем не зная сколько объектов находиться в каталоге. Объекты можно выбирать из базы данных только по частям указывая число смещения и количество.
Пагинатор который есть в Django не подходит по определению, потому что ему нужно дать все целиком что мы будем бить на страницы.
Что же делать?
Буду строить пагинацию по частям (разделам). Раздел - так называемая группа страниц (1-10, 11-20, ...)
-
на странице должно быть например 10 объектов
-
в разделе будет 10 страниц
то есть за раз я должен получить 100 объектов и построить раздел страниц (10 штук).
Но мне еще нужно знать есть ли еще данные чтобы построить очередной раздел.
Для этого я буду просить у базы 101 объект. И тут смотрим, если база вернула меньше 100 - значит делаю столько страниц на сколько хватает объектов. Если база вернула ровно 100 - значит строю 10 страниц и я уверен в том что больше объектов нету а значит и следующей страницы. Но если мне возвращается 101 объект - значит построением текущего раздела страниц все не заканчивается.
В общем хватит текста. Ближе к делу.
Я наваял небольшой класс который собсно и реализует то что я пытался описать выше. Немного покажу как пользоваться.
In [1]: from paginator import Paginator
Должна быть функция-источник данных.
In [2]: source = lambda offset, count: range(offset, offset+count)
так же указываем сколько объектов у нас на странице будет и сколько страниц в разделе
In [3]: p = Paginator(source, 5, 10)
получаю объекты которые будут например на 15 странице
In [4]: p.page(15)
Out[4]: [70, 71, 72, 73, 74]
смотрю сколько страниц в разделе
In [5]: p.pages
Out[5]: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
а есть ли еще страницы?
In [6]: p.has_next
Out[6]: 21
In [7]: p.has_prev
Out[7]: 10
Ну вот собсно все что я хотел рассказать.
Может кому-то когда-то пригодиться. Да сам если че сэкономлю 20 мин своего времени.
Файлик с исходником можно взять здесь.
Отзывов: 0
Оставить комментрий