日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django中扩展Paginator实现分页

發(fā)布時間:2024/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django中扩展Paginator实现分页 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Django中已經(jīng)實現(xiàn)了很多功能,基本上只要我們需要的功能,都能夠找到相應(yīng)的包。要在Django中實現(xiàn)分頁顯示,只需要簡單地使用Paginator就可以實現(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>&lt;&lt;</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>&gt;&gt;</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],以此類推,對我們來說的確是個問題。

正是因為有問題,因此也才有了我的博客,下面才是我真正的目的所在,擴(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ù)不用說了吧,就是重載了一下,添加了一個range_num參數(shù),代表在可能的情況下,當(dāng)前頁左右各顯示多少個頁標(biāo)簽,默認(rèn)值為5。

page()函數(shù)是對父類Paginator的page()函數(shù)的重寫,主要是為了記錄當(dāng)前頁。

核心是_page_range_ext()函數(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ì)分析了,大家可以參看源代碼,個人感覺還可以優(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。