django中的自定義分頁(yè)器的實(shí)現(xiàn)示例_第1頁(yè)
django中的自定義分頁(yè)器的實(shí)現(xiàn)示例_第2頁(yè)
django中的自定義分頁(yè)器的實(shí)現(xiàn)示例_第3頁(yè)
django中的自定義分頁(yè)器的實(shí)現(xiàn)示例_第4頁(yè)
django中的自定義分頁(yè)器的實(shí)現(xiàn)示例_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第django中的自定義分頁(yè)器的實(shí)現(xiàn)示例目錄1.什么是自定義分頁(yè)器2.為什么要用自定義分頁(yè)器3.如何使用自定義分頁(yè)器3.1自定義分頁(yè)器推導(dǎo)過(guò)程3.2自定義分頁(yè)器封裝代碼3.3封裝好分頁(yè)器的使用

1.什么是自定義分頁(yè)器

當(dāng)我們需要在前端頁(yè)面展示的數(shù)據(jù)太多的時(shí)候,我們總不能將數(shù)據(jù)展示在一頁(yè)上面吧!這時(shí),我們就需要自定義一個(gè)分頁(yè)器,將數(shù)據(jù)分成特定的頁(yè)數(shù)進(jìn)行展示,每一頁(yè)展示固定條數(shù)的數(shù)據(jù)!

2.為什么要用自定義分頁(yè)器

如上所說(shuō):為了將數(shù)據(jù)分成多頁(yè)進(jìn)行展示,分別閱讀,方便查詢!

3.如何使用自定義分頁(yè)器

3.1自定義分頁(yè)器推導(dǎo)過(guò)程

雖然!我們有一個(gè)封裝好的分頁(yè)器源碼,用的時(shí)候只需要cv大法就行,但是作為一名優(yōu)秀的程序猿?。∥覀冞€是需要知道底層的邏輯是不是!

我們需要明確的是,前端向后端請(qǐng)求的常用方式為get和post請(qǐng)求。分頁(yè)的時(shí)候,我們應(yīng)該采用get請(qǐng)求的方式給后端傳輸您需要轉(zhuǎn)到的頁(yè)數(shù)?。?/p>

其次我們還需要知道一個(gè)點(diǎn),queryset對(duì)象是支持索引取值和切片操作的,但是不支持負(fù)數(shù)索引情況。

接下來(lái),我們來(lái)推導(dǎo)一下分頁(yè)器的形成的邏輯:

current_page=request.GET.get("page",1)#獲取用戶想訪問(wèn)的頁(yè)碼如果沒(méi)有默認(rèn)展示第一頁(yè)

try:#由于后端接受到的前端數(shù)據(jù)是字符串類型所以我們這里做類型轉(zhuǎn)換處理加異常捕獲

current_page=int(current_page)

exceptExceptionase:

current_page=1

#還需要定義頁(yè)面到底展示幾條數(shù)據(jù)

per_page_num=10#一頁(yè)展示10條數(shù)據(jù)

#需要對(duì)總數(shù)據(jù)進(jìn)行切片操作需要確定切片起始位置和終止位置

start_page=

end_page=

下面需要研究current_page、per_page_num、start_page、end_page四個(gè)參數(shù)之間的數(shù)據(jù)關(guān)系

per_page_num=10

current_pagestart_pageend_page

1010

21020

32030

43040

per_page_num=5

current_pagestart_pageend_page

105

2510

31015

41520

可以很明顯的看出規(guī)律

start_page=(current_1)*per_page_num

end_page=current_page*per_page_num

我們研究完當(dāng)前頁(yè)(current_page)、每頁(yè)展示的數(shù)據(jù)條數(shù)(per_page_num)、每頁(yè)數(shù)據(jù)的起始位置(start_page)和結(jié)束位置(end_page)之后,我們還需要知道的最重要的一點(diǎn)是:

一共需要從數(shù)據(jù)庫(kù)取出的數(shù)據(jù)一共有多少條!??!

此時(shí),我們就需要用到python中的一個(gè)內(nèi)置方法divmod:它是功能是一個(gè)數(shù)除以另一個(gè)數(shù)時(shí),返回余數(shù)和商!!如:

divmod(100,10)

(10,0)#10頁(yè)

divmod(101,10)

(10,1)#11頁(yè)

divmod(99,10)

(9,9)#10頁(yè)

#余數(shù)只要不是0就需要在第一個(gè)數(shù)字上加一

我們可以用它來(lái)判斷我們一共需要多少頁(yè)!

后端自定義分頁(yè)器邏輯詳解:

defbook(request):

ifrequest.method=='GET':

current_page=request.GET.get('page',1)#獲取用戶需要訪問(wèn)的頁(yè)面,如果沒(méi)有默認(rèn)返回1

try:#異常捕獲,因?yàn)榍岸朔祷氐亩际亲址?,需要把他們都轉(zhuǎn)成數(shù)字類型,方便下面做運(yùn)算操作

current_page=int(current_page)

exceptExceptionase:

current_page=1#用戶輸入啥字母等也默認(rèn)為1

per_page_num=10#每頁(yè)展示多少條數(shù)據(jù)

start_page=(current_1)*per_page_num#當(dāng)前頁(yè)數(shù)起始數(shù)據(jù)

end_page=current_page*per_page_num#當(dāng)前頁(yè)結(jié)束數(shù)據(jù)

book_num=models.Book.objects.all()#將所有數(shù)據(jù)查詢出來(lái)

all_count=book_num.count()#統(tǒng)計(jì)一共有多少數(shù)據(jù)

num,more=divmod(all_count,per_page_num)#divmod方法計(jì)算需要的總頁(yè)數(shù)

ifmore:

all_page=num+1#more為余數(shù),余為0,則剛剛好是num頁(yè)數(shù),不為0,則頁(yè)數(shù)加1

#然后我們需要在html頁(yè)面的分頁(yè)器標(biāo)簽部分,for循環(huán)一下總共需要的num頁(yè)數(shù),但是有一個(gè)問(wèn)題是,前端無(wú)法使用range()

#這就需要我們?cè)诤蠖诉M(jìn)行循環(huán),再傳到前端

html=''

a=current_page#為了下面頁(yè)碼高亮調(diào)整

ifcurrent_page6:#當(dāng)頁(yè)面小于6時(shí),固定在6上面,為下面的for處理不出現(xiàn)頁(yè)碼負(fù)數(shù)

current_page=6

#訪問(wèn)第6頁(yè)時(shí),只會(huì)顯示當(dāng)前頁(yè)-5和+6的底部頁(yè)碼數(shù),但是當(dāng)頁(yè)面小于6時(shí),頁(yè)碼會(huì)出現(xiàn)0甚至負(fù)數(shù),所有我們需要對(duì)頁(yè)面進(jìn)行一個(gè)設(shè)置,就是上述的a

foriinrange(current_5,current_page+6):

ifa==i:

#當(dāng)前頁(yè)的頁(yè)面高亮顯示

html+='liahref="page=%s"rel="externalnofollow"rel="externalnofollow"%s/a/li'%(i,i)

else:

html+='liahref="page=%s"rel="externalnofollow"rel="externalnofollow"%s/a/li'%(i,i)

book_queryset=book_num[start_page:end_page]

returnrender(request,'book.html',locals())

前端頁(yè)面部分:

navaria-label="Pagenavigation"

ahref="#"rel="externalnofollow"rel="externalnofollow"aria-label="Previous"

spanaria-hidden="true"laquo;/span

/li

{{html|safe}}

ahref="#"rel="externalnofollow"rel="externalnofollow"aria-label="Next"

spanaria-hidden="true"raquo;/span

/li

/ul

/nav

3.2自定義分頁(yè)器封裝代碼

封裝好的分液器

3.3封裝好分頁(yè)器的使用

后端

defget_book(request):

book_list=models.Book.objects.all()

current_page=request.GET.get("page",1)

all_count=book_list.count()

page_obj=Pagination(current_page=current_page,all_count=all_count,per_page_num=10)

page_queryset=book_list[page_obj.start:page_obj.end]

returnrender(request,'booklist.html',locals())

前端

div

div

div

{%forbookinpage_queryset%}

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論