Я пытаюсь понять, как показать что-то вроде «Показ 1-10 из 52», используя нумерацию страниц django в моих шаблонах.
Я выполнил саму разбивку на страницы, но мне ничего не приходит в голову по поводу этого требования.
Есть идеи?
Я пытаюсь понять, как показать что-то вроде «Показ 1-10 из 52», используя нумерацию страниц django в моих шаблонах.
Я выполнил саму разбивку на страницы, но мне ничего не приходит в голову по поводу этого требования.
Есть идеи?
Как показано в документации, Paginator
имеют count
, который показывает общее количество объектов на всех страницах (в наборе запросов или списке, в котором они находятся). разбиение на страницы) и объекты Page
имеют start_index()
и end_index()
.
Итак, если вы передаете page
в контекст шаблона:
Showing {{ page.start_index }}-{{ page.end_index }} of {{ page.paginator.count }}
ListView
объект называется page_obj
, а не page
.
- person BigglesZX; 02.05.2016
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.
Я надеюсь, что это дало вам общее представление о том, как вы можете сделать это чисто.
Объект 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}}
(Я написал этот код без использования компилятора, поэтому протестируйте его)
paginator = Paginator(query, settings.SEARCH_DATA_PER_PAGE)
По количеству страниц:
num_of_pages = paginator.num_pages
Для общего количества элементов на всех страницах:
num_of_objects = paginator.count
Из этих данных можно рассчитать количество элементов на странице.
totalPages = math.ceil(float(totalRecords)/recordsPerPage)
or
paginatorInstance.num_pages # this is there by default
Не было ли это трудно, не так ли?