1. 程式人生 > >django分頁實現

django分頁實現

分頁是網站中比較常見的應用,django提供了一些類幫助管理分頁的資料,這些類都位於django.core.paginator.py檔案裡面

分頁類

建構函式

class Paginator(object_listper_pageorphans=0allow_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>