2009-11-06 2 views
9

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

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

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

ответ

37

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

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

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

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

эй! это точно, что я искал. благодаря! – webgonewild

+1

Это было очень полезно - спасибо. Заметьте, что по умолчанию в «ListView» объект называется 'page_obj', а не' page'. – BigglesZX

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

или

paginatorInstance.num_pages # this is there by default 

Было не так уж трудно, правда?

1

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

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

+0

просто отправить Paginator в шаблон, а затем получить доступ к свойствам pagintator как: {{offers.previous_page_number}}, {{offers.next_page_number}}, {{offers.paginator.count}} – gerpaick

3

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

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

Так что-то отдаленно напоминает:

Paginator(query, objects_per_page, current_page_number) 

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

Внутри инициализации постраничной навигации в вы хотите сделать что-то похожее на:

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.

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

+0

Peharps лучше подклассифицировать встроенный класс django.core.paginator.Paginator, чтобы добавить атрибуты lower_limit и upper_limit. – webgonewild

+0

Очень возможно, я не использовал django в тишине. Также num_pages кажется недействительным stat, из которого я сижу. Вы, кажется, хотите общее количество объектов, а не общее количество страниц, может быть другое решение для этого, однако, в paginator django. –

Смежные вопросы