Django中扩展Paginator实现分页
Django中已經實現了很多功能,基本上只要我們需要的功能,都能夠找到相應的包。要在Django中實現分頁顯示,只需要簡單地使用Paginator就可以實現了。
首先,需要在應用的views.py中添加如下引用:
from?django.core.paginator?import?Paginatorfrom?django.core.paginator?import?PageNotAnIntegerfrom?django.core.paginator?import?EmptyPage然后,在需要使用分頁的view函數中,添加如下代碼:
blogs?=?Blog.objects.all()?#?Get?released?blogspaginator?=?Paginator(blogs,?8)try:blogs?=?paginator.page(page_num)except?PageNotAnInteger:blogs?=?paginator.page(1)except?EmptyPage:blogs?=?paginator.page(paginator.num_pages)以上代碼中,page_num是指的當前需要顯示的頁,要將當前頁的內容顯示出來,就跟使用原對象一樣,基本沒有什么區別,我們還是只需要像如下在模板中使用:
{%?for?blog?in?blogs?%}{{?blog.name?}}{{?blog.content?}}......{%?endfor?%}最后,為了顯示分頁導航信息,我們需要在模板中添加如下代碼:
{%?if?blogs.has_previous?%}<a?class='paginator'?title='上一頁'?href='?page={{?blogs.previous_page_number?}}'><span><<</span></a>{%?endif?%}{%?for?page?in?blogs.paginator.page_range?%}{%?if?page?=?blogs.number?%}<a?class='paginator_current'?title='當前頁:{{?page?}}'><span>{{?page?}}</span></a>{%?else?%}<a?class='paginator'?href='?page={{?page?}}'?title='{{?page?}}'><span>{{?page?}}</span></a>{%?endif?%}{%?endfor?%}{%?if?blogs.has_next?%}<a?class='paginator'?title='下一頁'?href='?page={{?blogs.next_page_number?}}'><span>>></span></a>{%?endif?%}OK,一切就這么簡單,對數據進行分頁顯示就完成了。
但是,等等,這里好像還有問題,如果我的數據很多,分出來的頁面數也很多,那豈不是分頁導航將顯示很長的一串數字?
的確是這樣,page_range根據總頁數,返回從1到總頁數之間在數字序列,例如總頁數是5, 則page_range返回的值將是[1,2,3,4,5],以此類推,對我們來說的確是個問題。
正是因為有問題,因此也才有了我的博客,下面才是我真正的目的所在,擴展框架自帶的Paginator,廢話少說,直接上代碼:
from?django.core.paginator?import?Paginatorclass?JuncheePaginator(Paginator):def?__init__(self,?object_list,?per_page,?range_num=5,?orphans=0,?allow_empty_first_page=True):Paginator.__init__(self,?object_list,?per_page,?orphans,?allow_empty_first_page)self.range_num?=?range_numdef?page(self,?number):self.page_num?=?numberreturn?super(JuncheePaginator,?self).page(number)def?_page_range_ext(self):num_count?=?2?*?self.range_num?+?1if?self.num_pages?<=?num_count:return?range(1,?self.num_pages?+?1)num_list?=?[]num_list.append(self.page_num)for?i?in?range(1,?self.range_num?+?1):if?self.page_num?-?i?<=?0:num_list.append(num_count?+?self.page_num?-?i)else:num_list.append(self.page_num?-?i)if?self.page_num?+?i?<=?self.num_pages:num_list.append(self.page_num?+?i)else:num_list.append(self.page_num?+?i?-?num_count)num_list.sort()return?num_listpage_range_ext?=?property(_page_range_ext)為了減少文章篇幅,我特意將一些注釋去掉了。現在簡單地解釋一 下。
__init__()函數不用說了吧,就是重載了一下,添加了一個range_num參數,代表在可能的情況下,當前頁左右各顯示多少個頁標簽,默認值為5。
page()函數是對父類Paginator的page()函數的重寫,主要是為了記錄當前頁。
核心是_page_range_ext()函數,它實現了我們根據page_num的情況來返回恰當的頁面列表,page_num取默認值的情況下,如果 當前頁是8,則我們返回的頁數列表就應該是[3,4,5,6,7,8,9,10,11,12,13],但如果說是當前頁是2,則會返回 [1,2,3,4,5,6,7,8,9,10,11],其余的以此類推。具體算法我就不仔細分析了,大家可以參看源代碼,個人感覺還可以優化,但我現在也 就能用就行。
接下來還需要在views.py中將以下語句:
paginator?=?Paginator(blogs,?8)改為:
paginator?=?JuncheePaginator(blogs,?8)在模板中,將以下語句:
{%?for?page?in?blogs.paginator.page_range?%}改為:
{%?for?page?in?blogs.paginator.page_range_ext?%}其它的事情,呵呵,那就是快去美化你的頁面吧!
轉載于:https://blog.51cto.com/1161192890/1638313
總結
以上是生活随笔為你收集整理的Django中扩展Paginator实现分页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何验证本地磁盘或网络磁盘是否可以进行读
- 下一篇: 数据仓库专题(6)-数据仓库、主题域、主