Пагинация. Когда не знаем сколько страниц будет

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

В общем нужно было построить пагинацию для каталога, причем не зная сколько объектов находиться в каталоге. Объекты можно выбирать из базы данных только по частям указывая число смещения и количество.

Пагинатор который есть в 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 мин своего времени.

Файлик с исходником можно взять здесь.


Опубликовано в категории IT с тегами

Отзывов: 0


Оставить комментрий