版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 22184-2025谷物和豆類散存糧食溫度測(cè)定指南
- 湖南省衡陽(yáng)市常寧市2025-2026學(xué)年七年級(jí)上學(xué)期期末質(zhì)量監(jiān)測(cè)道德與法治試卷(含答案)
- 安徽省蚌埠市固鎮(zhèn)縣部分學(xué)校2025-2026學(xué)年九年級(jí)上學(xué)期1月期末數(shù)學(xué)試題答案
- 2025-2026學(xué)年山東煙臺(tái)長(zhǎng)島第二實(shí)驗(yàn)學(xué)校 九年級(jí)(上下冊(cè))期末道德與法治試卷(無(wú)答案)
- 五年級(jí)數(shù)學(xué)期末考試卷及答案
- 為民服務(wù)題庫(kù)及答案
- 網(wǎng)絡(luò)的題目及答案
- 初中數(shù)學(xué)培訓(xùn)
- 北京警察學(xué)院《Photoshop 圖像處理》2024 - 2025 學(xué)年第一學(xué)期期末試卷
- 2022~2023安全員考試題庫(kù)及答案第254期
- 特種工安全崗前培訓(xùn)課件
- 2026屆福建省三明市第一中學(xué)高三上學(xué)期12月月考?xì)v史試題(含答案)
- (正式版)DB51∕T 3342-2025 《爐灶用合成液體燃料經(jīng)營(yíng)管理規(guī)范》
- 2026北京海淀初三上學(xué)期期末語(yǔ)文試卷和答案
- 2025學(xué)年度人教PEP五年級(jí)英語(yǔ)上冊(cè)期末模擬考試試卷(含答案含聽(tīng)力原文)
- 醫(yī)院醫(yī)院醫(yī)院后勤管理
- 2025年岐黃天使中醫(yī)課后試題及答案
- 肺癌術(shù)后呼吸功能鍛煉指導(dǎo)
- 保障供貨協(xié)議書(shū)
- 2025年中國(guó)糖尿病腎臟病基層管理指南(全文)
- 顱內(nèi)腫瘤切除術(shù)手術(shù)配合
評(píng)論
0/150
提交評(píng)論