django的分頁機制

2021-04-21 21:23:00 字數 4488 閱讀 3310

翻譯自官方文件

django 1.0 中分頁機制和先前已經大不相同。它提供了一些類協助你把資料分頁。 對應的檔案為 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

>>>

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()3

>>>

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

)...

emptypage: that page number is less than 1

>>> p.

page(3

)...

emptypage: that page contains no results

note

paginator

的第乙個引數可以是list,tuple,queryset 或者任意物件————只要它 有 count()

或者 __len__()

函式。 django後台會先嘗試呼叫 count()``。如果

不可行,再定要

``len() 。

下面是乙個複雜點的分頁例子。也就是把查詢子集在檢視中分頁顯示。下面演示了如何結合檢視 view,模板template來顯示結果。前提是假設``contacts`` model 已經被匯入。

檢視view 函式:

from

django.core.paginator

import

paginator

,invalidpage

,emptypage

deflisting

(request

):contact_list

=contacts

.objects

.all

()paginator

=paginator

(contact_list,25

)# show 25 contacts per page

# make sure page request is an int. if not, deliver first page.

try:

page

=int

(request

.get

.get

('page'

,'1'

))except

valueerror

:page=1

# if page request (9999) is out of range, deliver last page of results.

try:

contacts

=paginator

.page

(page

)except

(emptypage

,invalidpage

):contacts

=paginator

.page

(paginator

.num_pages

)return

render_to_response

('list.html',)

在模板檔案 list.html 中,將顯示每個物件的一些資訊,以及導航標記。:

}...

previous

page } of }.

next

建構函式:

paginator(object_list, per_page, orphans=0, allow_empty_first_page=true)

object_list

乙個list,tuple,django的queryset,或者擁有``count()``或``__len__()``方法的 可分解物件。

per_page

每一頁最大的物件個數。

orphans

最後一頁物件的最少數目,預設為0。 如果想避免最後一頁顯示太少。則可以使用這個值。 那麼最後一頁的資料,自動被前移一頁。比如總共23個資料。每頁顯示 10.

orphans=3

那麼,第一頁為10,第二頁為13.

allow_empty_first_page

表示首頁是否可以為空,如果是

false

而且``object_list`` 為空,那麼會觸發

emptypage

異常。paginator.page(number)

根據索引number,返回乙個』page』物件,如果不存在,引起 invalidpage異常

paginator.count

所有物件的總數, 嘗試通過``object_list.count()``和``object_list.__len__()`` 取得
paginator.num_pages

總共的頁數
paginator.page_range

頁的範圍,比如

[1,2,3,

4] 。

當頁面不存在或者無效時,會引起``invalidpage``異常,一般這個異常就夠用,如果需要更 詳細資訊,還有``pagenotaninteger``,``emptypage``可用:

pagenotaninteger

page()

的引數非整數。

emptypage

page(x)

,第x頁沒資料。

上述兩個都是 invalidpage 的子類。 用乙個簡單的 except

invalidpage

就可以處理。

page(object_list, number, paginator):

一般不需使用者自己構造,通過`paginator.page` 生成。

page.has_next()

page.has_previous()

如果前一頁存在返回

true

page.has_other_pages()

page.next_page_number()

page.previous_page_number()

page.start_index()

返回當前頁,第乙個物件的索引。
page.end_index()

道理同上。

page.object_list

當前頁物件列表
page.number

當前頁的索引
page.paginator

和page相關的分頁類

Django中的分頁

直接看 吧,還算比較簡單 先確認資料量有多少 根據頁面顯示資料的多少來分割資料,得到頁面的開始資料和結束資料 根據開始和截止資料去切片資料,並且得到總共的頁碼數 根據一頁顯示多少頁碼和當前頁碼數,得到開始和截止的頁碼 內容為字串拼湊的html標籤,並拼接到一起 匯入mark safe模組,將字串轉化...

Django中的分頁

直接看 吧,還算比較簡單 先確認資料量有多少 根據頁面顯示資料的多少來分割資料,得到頁面的開始資料和結束資料 根據開始和截止資料去切片資料,並且得到總共的頁碼數 根據一頁顯示多少頁碼和當前頁碼數,得到開始和截止的頁碼 內容為字串拼湊的html標籤,並拼接到一起 匯入mark safe模組,將字串轉化...

Django中的分頁

django中分頁需要匯入分頁的工具,存在於django.core中,所以導包需要輸入 from django.core paginator import paginatorpaginator分別有三條屬性 count 記錄資料的總條數 num pages 記錄總頁數 page range 頁碼範圍...