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

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

Я выполнил саму разбивку на страницы, но мне ничего не приходит в голову по поводу этого требования.
Есть идеи?


person webgonewild    schedule 06.11.2009    source источник


Ответы (5)


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

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

Showing {{ page.start_index }}-{{ page.end_index }} of {{ page.paginator.count }}
person Daniel Roseman    schedule 06.11.2009
comment
Это было очень полезно - спасибо. Единственное замечание, которое я хотел бы иметь, это то, что по умолчанию в ListView объект называется page_obj, а не page. - person BigglesZX; 02.05.2016
comment
Я получил эту ошибку. jinja2.exceptions.UndefinedError: «flask_sqlalchemy.Pagination object» не имеет атрибута «paginator» - person Sathiyakugan; 30.03.2019
comment
Да, легко спутать общее количество записей в наборе запросов с общим количеством записей в модели. Если вы хотите, чтобы общее количество записей в модели передавалось отдельно, page.paginator.count предоставит общее количество из набора запросов. - person yekta; 24.07.2020

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

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

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

Paginator(query, objects_per_page, current_page_number)

А затем передайте полученный объект 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.

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

person Bryan McLemore    schedule 06.11.2009
comment
Возможно, лучше создать подкласс встроенного класса django.core.paginator.Paginator, чтобы добавить атрибуты lower_limit и upper_limit. - person webgonewild; 06.11.2009
comment
Очень возможно, я некоторое время не использовал django в тишине. Кроме того, num_pages кажется недействительной статистикой с того места, где я сижу. Кажется, вам нужно общее количество объектов, а не общее количество страниц, для этого может быть другое решение, однако в пагинаторе django. - person Bryan McLemore; 06.11.2009

Объект 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}}

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

person marcc    schedule 06.11.2009
comment
просто отправьте пагинатор в шаблон, а затем получите доступ к свойствам пагинатора, например: {{ offer.previous_page_number }}, {{ offer.next_page_number }}, {{ offer.paginator.count }} - person gerpaick; 11.11.2017

paginator = Paginator(query, settings.SEARCH_DATA_PER_PAGE)

По количеству страниц:

num_of_pages = paginator.num_pages

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

num_of_objects = paginator.count

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

person Sumit Badsara    schedule 19.12.2018

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

or

paginatorInstance.num_pages # this is there by default

Не было ли это трудно, не так ли?

person Prody    schedule 06.11.2009