django Paginator分頁模組

雲中不知人發表於2017-05-08

Django提供了一些類來幫助你管理分頁的資料 -- 也就是說,資料被分在不同頁面中,並帶有“上一頁/下一頁”標籤。這些類位於django/core/paginator.py中。

示例

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']

>>> 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

>>> 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

注意

注意你可以向Paginator提供一個列表或元組,Django的QuerySet,或者任何帶有count()__len__()方法的物件。當計算傳入的物件所含物件的數量時,Paginator會首先嚐試呼叫count(),接著如果傳入的物件沒有count()方法則回退呼叫 len()這樣會使類似於Django的QuerySet的物件使用更加高效的 count()方法,如果存在的話。

使用 Paginator

這裡有一些複雜一點的例子,它們在檢視中使用 Paginator 來為查詢集分頁。我們提供檢視以及相關的模板來展示如何展示這些結果。這個例子假設你擁有一個已經匯入的Contacts模型。

檢視函式看起來像是這樣:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

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

    page = request.GET.get('page')
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)

    return render_to_response('list.html', {"contacts": contacts})

list.html模板中,你會想要包含頁面之間的導航,以及來自物件本身的任何有趣的資訊:

<div class="pagination">
    <span class="step-links">
        

        <span class="current">
            Page  of .
        </span>

        
    </span>
</div>

屬性

Paginator.count

所有頁面的物件總數。

注意

當計算object_list所含物件的數量時, Paginator會首先嚐試呼叫object_list.count()如果object_list沒有 count() 方法,Paginator 接著會回退使用len(object_list)這樣會使類似於Django’s QuerySet的物件使用更加便捷的count()方法,如果存在的話。

Paginator.num_pages

頁面總數。

Paginator.page_range

頁碼的範圍,從1開始,例如[1, 2, 3, 4]

方法

Page.has_next()[source]

如果有下一頁,則返回True

Page.has_previous()[source]

如果有上一頁,返回 True

Page.has_other_pages()[source]

如果有上一頁下一頁,返回True

Page.next_page_number()[source]

返回下一頁的頁碼。如果下一頁不存在,丟擲InvalidPage異常。

Page.previous_page_number()[source]

返回上一頁的頁碼。如果上一頁不存在,丟擲InvalidPage異常。

Page.start_index()[source]

返回當前頁上的第一個物件,相對於分頁列表的所有物件的序號,從1開始。比如,將五個物件的列表分為每頁兩個物件,第二頁的start_index()會返回3

Page.end_index()[source]

返回當前頁上的最後一個物件,相對於分頁列表的所有物件的序號,從1開始。 比如,將五個物件的列表分為每頁兩個物件,第二頁的end_index() 會返回 4

屬性

Page.object_list

當前頁上所有物件的列表。

Page.number

當前頁的序號,從1開始。

Page.paginator

相關的Paginator物件。


相關文章