Гибкая нумерация страниц в Джанго - PullRequest
2 голосов
/ 13 ноября 2009

Я хотел бы реализовать разбиение на страницы, чтобы я мог позволить пользователю выбирать количество записей на странице, например 10, 25, 50 и т. Д. Как мне поступить? Есть ли приложение, которое я могу добавить в свой проект, чтобы сделать это?

Спасибо

Ответы [ 4 ]

4 голосов
/ 13 ноября 2009

Django имеет встроенный в ядро ​​объект Paginator. Это довольно простой API для использования. Создайте класс Paginator с двумя аргументами: список и количество записей на «страницу». Я вставлю пример кода внизу.

В вашем случае вы хотите разрешить пользователю выбирать количество страниц. Вы можете включить подсчет количества страниц в URL (т. Е. Ваш / 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']
1 голос
/ 13 ноября 2009

Google на "django pagination" и убедитесь, что в вашем SQL используется "индекс покрытия" для эффективного запроса.

0 голосов
/ 09 июля 2015

Что нужно? Ну.

Вы можете добавить пользовательский элемент управления для change_list.html, например, для блока pagination .

Это будет страница перезагрузки списка с параметром get per_page , например, с определенным значением onchange event.

Для вашей 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 для доступа к этим значениям в шаблоне. Может быть, есть более аккуратный подход к доступу, я не знаю :-)

0 голосов
/ 13 ноября 2009

T. Ответ Стоуна охватывает большую часть того, что я собирался сказать. Я просто хочу добавить, что вы можете использовать нумерацию страниц в 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, чтобы отобразить объекты для этой страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...