django分頁實現
阿新 • • 發佈:2019-02-02
分頁是網站中比較常見的應用,django提供了一些類幫助管理分頁的資料,這些類都位於django.core.paginator.py檔案裡面
分頁類
建構函式
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
必需引數:
object_list:具有count()或者__len__()方法的可切片的物件,比如列表,元組或者django queryset
per_page:每頁最大的條目數量
可選引數:
- orphans:orphan是孤兒的意思,這個引數指明最後一頁的最少條目數字是多少,預設是0。假如orphans是3,你的最後一頁只有兩個條目,那麼這兩個條目將會被併到前一頁去,而不會形成”孤兒“(最後一個太少條目)
- allow_empty_first_page:是否允許第一頁是空(沒有一個條目),如果是假,那麼當object_list是空的時候,丟擲EmptyPage的錯誤
方法
- Paginator.page(number):返回一個頁物件(從1開始算起),如果不存在丟擲一個InvalidPage異常
屬性
- Paginator.count:object_list中的條目的總條數
- Paginator.num_pages:總頁數
- Paginator.page_range:頁範圍,從1開始算起,例如:[1,2,3,4]
InvalidPage 異常
有三個異常,InvalidPage,PageNotAnInteger和EmptyPage,看下面的程式碼即可以知道他們之間的關係
1 2 3 4 5 6 7 8 |
class
InvalidPage(Exception):
pass
class
PageNotAnInteger(InvalidPage):
pass
class
EmptyPage(InvalidPage):
pass
|
頁類
Paginator.page()函式返回一個頁物件,類原型是class Page(object_list,number,paginator)
方法
- Page.has_next():如果還有下一頁,返回真
- Page.has_previous():如果有前一頁,返回真
- Page.has_other_pages():如果還有前一頁或者下一頁,返回真
- Page.next_page_number():返回下一頁的頁碼,不管下一頁是否存在
- Page.previous_page_number():返回前一頁的頁碼,不管前一頁是否存在
- Page.start_index():當前頁的元素的開始編號,例如5個元素每兩個元素一頁,那麼共有三頁,第二頁的start_index()是3
- Page.end_index():當前頁的元素的結束編號,例如5個元素每兩個元素一頁,那麼共有三頁,第二頁的end_index()是4
屬性
- Page.object_list:這一頁上的元素的形成的列表
- Page.number:當前頁的頁碼
- Page.Paginator:關聯的Paginator物件
最後我們看一下應用的例子吧:
檢視函式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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})
|
模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{%
for
contact in contacts %}
{#
Each "contact"
is a Contact model object. #}
{{
contact.full_name|upper }}
...
{%
endfor %}
<div
class = "pagination" >
<span
class = "step-links" >
{%
if
contacts.has_previous %}
<a
href= "?page={{
contacts.previous_page_number }}" >previous</a>
{%
endif %}
<span
class = "current" >
Page
{{ contacts.number }} of {{ contacts.paginator.num_pages }}.
</span>
{%
if
contacts.has_next %}
<a
href= "?page={{
contacts.next_page_number }}" >next</a>
{%
endif %}
</span>
</div>
|