Показывать количество страниц в django pagination

Я пытаюсь понять, как показать что-то вроде "Показ 1-10 из 52" с использованием нумерации django в моих шаблонах.

Я сам выполнил нумерацию страниц, но мне не пришло в голову это требование.
Есть идеи?

Ответ 1

Не знаю, почему все так усложняют ситуацию. Как показано документация, все эти атрибуты уже доступны.

Объекты Paginator имеют атрибут count, который показывает общее количество объектов на всех страницах, а Page объекты имеют свойства start_index и end_index.

Итак, если вы передадите Page в контекст шаблона:

{{ page.start_index }} to {{ page.end_index }} of {{ page.paginator.count }}.

Ответ 2

Вам нужно сделать что-то умеренно более сложное за кулисами. И обратите внимание, что, хотя я разработчик python, я давно использую werkzeug и jinja2, поэтому мой синтаксис django немного ржавый. Кроме того, это было сухое кодирование (как и в том, что я просто набрал его здесь в браузере) и должен быть протестирован, чтобы убедиться, что он работает по назначению.

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

Так что-то смутно похожее на:

Paginator(query, objects_per_page, current_page_number)

И затем передайте полученный объект paginator в шаблон.

Внутри paginator init вы хотите сделать что-то похожее на:

def __init__(self, query, objects_per_page, current_page_number):
    self.total = query.count()

    self.per_page = objects_per_page
    self.current_page_number = current_page_number
    self.lower_limit = objects_per_page * current_page_number
    self.upper_limit = objects_per_page * (current_page_number + 1)

    if self.upper_limit > self.total:
        self.upper_limit = self.total

    self.objects = query[self.lower_limit - 1:self.upper_limit - 1]

Затем в шаблоне вы сделаете что-то вроде

Showing {{paginator.lower_limit}}-{{paginator.upper_limit}} of {{paginator.total}}

И позже, когда вы будете готовы перебирать объекты, вы можете просто перебирать объекты paginator.objects.

Надеюсь, это даст вам общее представление о том, как вы можете это сделать.

Ответ 3

Объект django Paginator имеет свойство num_pages. На ваш взгляд, вы можете просто передать правильные данные в свой шаблон и показать его там.

Итак, пример (грубая):

вид

 current_page = ## input param 
 items_per_page = 10  
 paginator = Paginator(result, items_per_page)    

 ...
 return render_to_response('template.html', 
   {
     'num_pages': paginator.num_pages,
     'start_count': items_per_page * current_page + 1,
     'end_count': (items_per_page * current_page + 1) + len(paginator(current_page).object_list)
     'items_per_page':  items_per_page
   }

шаблон

showing {{start_count} - {{end_count}} of {{num_pages}}

(я написал этот код без преимущества компилятора, поэтому протестируйте его)

Ответ 4

paginator = Paginator(query, settings.SEARCH_DATA_PER_PAGE)

Для количества страниц:

num_of_pages = paginator.num_pages

Для общего количества элементов на всех страницах:

num_of_objects = paginator.count

По этим данным вы можете рассчитать количество элементов на странице.

Ответ 5

totalPages = math.ceil(float(totalRecords)/recordsPerPage)

или

paginatorInstance.num_pages # this is there by default

Разве это не так сложно?