Django-paginator 모듈을 사용한 페이지 나누기

11445 단어
Django는 페이지가 매우 easy로 나누어지는paginator 모듈을 전문적으로 제공합니다.
다음 예에서는 django 공식 문서를 참조합니다.https://docs.djangoproject.com/en/1.11/topics/pagination/
Paginator 클래스 사용
Paginator 실례화는 두 개의 인자가 필요합니다. 하나는 페이지를 나누려는 대상list (count 방법이나 len 방법을 실현해야 함) 이고, 다른 하나는 페이지당 수량입니다.Paginator 객체 속성:
count      
num_pages     
page_range           
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)

>>> p.count
4
>>> p.num_pages
2
>>> type(p.page_range)
<class 'range_iterator'>
>>> p.page_range
range(1, 3)

Paginator 객체의 중요한 방법인 페이지 () 는 페이지 번호를 매개 변수로 받아들여 현재 페이지 대상을 되돌려줍니다.객체의 등록 정보 및 방법:
object_list          
has_next()       
has_ previous()       
has_other_pages()       
next_page_number()       
previous_page_number()       
start_index()                     ,  , 1   
end_index()                     ,  , 1   
paginator     Paginator  
>>> page1 = p.page(1)
>>> page1

>>> page1.object_list
['john', 'paul']

>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
Traceback (most recent call last):
...
EmptyPage: That page contains no results
>>> page2.previous_page_number()
1
>>> page2.start_index() # The 1-based index of the first item on this page
3
>>> page2.end_index() # The 1-based index of the last item on this page
4

Pagenator의 페이지 방법은 페이지 번호가 없는 범위 밖의 값을 전달하면 EmptyPage의 이상을 받습니다.
>>> p.page(0)
Traceback (most recent call last):
...
EmptyPage: That page number is less than 1
>>> p.page(3)
Traceback (most recent call last):
...
EmptyPage: That page contains no results

뷰에서는 다음과 같이 사용할 수 있습니다.
# views.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render

def listing(request):
    contact_list = Contacts.objects.all()
    paginator = Paginator(contact_list, 25) #     25 

    page = request.GET.get('page') #       
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        #
        contacts = paginator.page(1)
    except EmptyPage:
        #
        contacts = paginator.page(paginator.num_pages)

    return render(request, 'list.html', {'contacts': contacts})

contacts 대상은 페이지 정보가 있는QuerySet을 사용하여 템플릿을 렌더링합니다:list.html
{% for contact in contacts %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}
... {% endfor %}
class="pagination"> class="step-links"> {% if contacts.has_previous %} "?page={{ contacts.previous_page_number }}">previous {% endif %} class="current"> Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}. {% if contacts.has_next %} "?page={{ contacts.next_page_number }}">next {% endif %}

모델 클래스에 기반한 보기,paginateby 값을 부여하면 됩니다. 더 간단할 것 같습니다.
class BookListView(generic.ListView):
    model = Book
    context_object_name = 'book_list'
    template_name = 'catalog/book_list.html'
    paginate_by = 10

템플릿은 통용입니다. 템플릿에서 is 를 호출할 수 있습니다.paginated에서 페이지 정보가 있는지 판단합니다.페이지 사용 중obj 대상 페이지 나누기 실현.
{% block pagination %}
  {% if is_paginated %}
    
class="pagination"> class="pagelinks"> {% if page_obj.has_previous %} "{{ request.path }}?page={{ page_obj.previous_page_number }}">previous {% endif %} class="page-current"> Page{{ page_obj.number }} of {{ page_obj.paginator.num_pages }}. {% if page_obj.has_next %} "{{ request.path }}?page={{ page_obj.next_page_number }}">next {% endif %}
{% endif %} {% endblock %}

좋은 웹페이지 즐겨찾기