Гибкая нумерация страниц в Джанго
Я хотел бы реализовать разбиение на страницы так, чтобы я мог позволить пользователю выбирать количество записей на страницу, например, 10, 25, 50 и т. Д. Как мне поступить? Есть ли приложение, которое я могу добавить в свой проект, чтобы сделать это?
Спасибо
4 ответа
В Django есть объект Paginator, встроенный в ядро. Это довольно простой API для использования. Создать Paginator
класс с двумя аргументами: список и количество записей на "страницу". Я вставлю пример кода внизу.
В вашем случае вы хотите разрешить пользователю выбирать количество страниц. Вы можете сделать подсчет количества страниц частью URL (т. Е. Your/page/10/) или сделать это строкой запроса (т. Е. Your/page/? P =10).
Что-то вроде...
# Assuming you're reading the Query String value ?p=
try:
per_page = int(request.REQUEST['p'])
except:
per_page = 25 # default value
paginator = Paginator(objects, per_page)
Вот пример кода со страницы документации Django для Paginator, чтобы лучше понять, как он работает.
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)
>>> p.count
4
>>> p.num_pages
2
>>> p.page_range
[1, 2]
>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']
Google на "django pagination" и убедитесь, что в вашем SQL используется "индекс покрытия" для эффективного запроса.
Что нужно? Что ж.
Вы можете добавить пользовательский элемент управления для change_list.html, например, для блока нумерации страниц.
Это будет перезагрузка списка страниц с параметром get per_page, например, с определенным значением события onchange.
Для вашей adminModel вы должны переопределить метод changelist_view, где вы должны обработать параметр get и установить это значение как значение поля list_per_page.
def changelist_view(self, request):
if request.GET.get('per_page') and int(
request.GET.get('per_page')) in CHANGELIST_PERPAGE_LIMITS:
self.list_per_page = int(request.GET.get('per_page'))
else:
self.list_per_page = 100
extra_context = {'changelist_perpage_limits': CHANGELIST_PERPAGE_LIMITS,
'list_per_page': self.list_per_page}
return super(mymodelAdmin, self).changelist_view(request, extra_context)
Я использую extra_context для доступа к этим значениям в шаблон. Может быть, есть более аккуратный подход к доступу, я не знаю:-)
Ответ Т. Стоуна охватывает большую часть того, что я собирался сказать. Я просто хочу добавить, что вы можете использовать нумерацию страниц в Generic Views. В частности, вы можете найти django.views.generic.list_detail.object_list
полезно.
Вы можете написать небольшую функцию-обертку, которая получает количество объектов для отображения на странице из request
объект, затем вызывает object_list
,
def paginated_object_list(request, page):
my_queryset=MyModel.objects.all()
#Here's T. Stone's code to get the number of items per page
try:
per_page = int(request.REQUEST['p'])
except:
per_page = 25 # default value
return object_list(request, queryset=my_queryset,
paginate_by=per_page, page=page)
Тогда контекст для вашего шаблона будет содержать переменные,
paginator
: Примерdjango.core.paginator.Paginator
,page_obj
: Примерdjango.core.paginator.Page
,
и вы можете перебрать page_obj
для отображения объектов для этой страницы.