Django中扩展Paginator实现分页
Django中已經(jīng)實(shí)現(xiàn)了很多功能,基本上只要我們需要的功能,都能夠找到相應(yīng)的包。要在Django中實(shí)現(xiàn)分頁顯示,只需要簡單地使用Paginator就可以實(shí)現(xiàn)了。
首先,需要在應(yīng)用的views.py中添加如下引用:
from?django.core.paginator?import?Paginatorfrom?django.core.paginator?import?PageNotAnIntegerfrom?django.core.paginator?import?EmptyPage然后,在需要使用分頁的view函數(shù)中,添加如下代碼:
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是指的當(dāng)前需要顯示的頁,要將當(dāng)前頁的內(nèi)容顯示出來,就跟使用原對象一樣,基本沒有什么區(qū)別,我們還是只需要像如下在模板中使用:
{%?for?blog?in?blogs?%}{{?blog.name?}}{{?blog.content?}}......{%?endfor?%}最后,為了顯示分頁導(dǎo)航信息,我們需要在模板中添加如下代碼:
{%?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='當(dāng)前頁:{{?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,一切就這么簡單,對數(shù)據(jù)進(jìn)行分頁顯示就完成了。
但是,等等,這里好像還有問題,如果我的數(shù)據(jù)很多,分出來的頁面數(shù)也很多,那豈不是分頁導(dǎo)航將顯示很長的一串?dāng)?shù)字?
的確是這樣,page_range根據(jù)總頁數(shù),返回從1到總頁數(shù)之間在數(shù)字序列,例如總頁數(shù)是5, 則page_range返回的值將是[1,2,3,4,5],以此類推,對我們來說的確是個(gè)問題。
正是因?yàn)橛袉栴},因此也才有了我的博客,下面才是我真正的目的所在,擴(kuò)展框架自帶的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)為了減少文章篇幅,我特意將一些注釋去掉了。現(xiàn)在簡單地解釋一 下。
__init__()函數(shù)不用說了吧,就是重載了一下,添加了一個(gè)range_num參數(shù),代表在可能的情況下,當(dāng)前頁左右各顯示多少個(gè)頁標(biāo)簽,默認(rèn)值為5。
page()函數(shù)是對父類Paginator的page()函數(shù)的重寫,主要是為了記錄當(dāng)前頁。
核心是_page_range_ext()函數(shù),它實(shí)現(xiàn)了我們根據(jù)page_num的情況來返回恰當(dāng)?shù)捻撁媪斜?#xff0c;page_num取默認(rèn)值的情況下,如果 當(dāng)前頁是8,則我們返回的頁數(shù)列表就應(yīng)該是[3,4,5,6,7,8,9,10,11,12,13],但如果說是當(dāng)前頁是2,則會返回 [1,2,3,4,5,6,7,8,9,10,11],其余的以此類推。具體算法我就不仔細(xì)分析了,大家可以參看源代碼,個(gè)人感覺還可以優(yōu)化,但我現(xiàn)在也 就能用就行。
接下來還需要在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?%}其它的事情,呵呵,那就是快去美化你的頁面吧!
轉(zhuǎn)載于:https://blog.51cto.com/1161192890/1638313
總結(jié)
以上是生活随笔為你收集整理的Django中扩展Paginator实现分页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何验证本地磁盘或网络磁盘是否可以进行读
- 下一篇: 数据仓库专题(6)-数据仓库、主题域、主