<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當我們需要在前端頁面展示的資料太多的時候,我們總不能將資料展示在一頁上面吧!這時,我們就需要自定義一個分頁器,將資料分成特定的頁數進行展示,每一頁展示固定條數的資料!
如上所說:為了將資料分成多頁進行展示,分別閱讀,方便查詢!
雖然!我們有一個封裝好的分頁器原始碼,用的時候只需要cv大法就行,但是作為一名優秀的程式猿!!我們還是需要知道底層的邏輯是不是!
我們需要明確的是,前端向後端請求的常用方式為get和post請求。分頁的時候,我們應該採用get請求的方式給後端傳輸您需要轉到的頁數!!
其次我們還需要知道一個點,queryset物件是支援索引取值和切片操作的,但是不支援負數索引情況。
接下來,我們來推導一下分頁器的形成的邏輯:
current_page = request.GET.get("page",1) # 獲取使用者想存取的頁碼 如果沒有 預設展示第一頁 try: # 由於後端接受到的前端資料是字串型別所以我們這裡做型別轉換處理加異常捕獲 current_page = int(current_page) except Exception as e: current_page = 1 # 還需要定義頁面到底展示幾條資料 per_page_num = 10 # 一頁展示10條資料 # 需要對總資料進行切片操作 需要確定切片起始位置和終止位置 start_page = ? end_page = ? """ 下面需要研究current_page、per_page_num、start_page、end_page四個引數之間的資料關係 per_page_num = 10 current_page start_page end_page 1 0 10 2 10 20 3 20 30 4 30 40 per_page_num = 5 current_page start_page end_page 1 0 5 2 5 10 3 10 15 4 15 20 可以很明顯的看出規律 start_page = (current_page - 1) * per_page_num end_page = current_page* per_page_num """
我們研究完當前頁(current_page)、每頁展示的資料條數(per_page_num)、每頁資料的起始位置(start_page)和結束位置(end_page)之後,我們還需要知道的最重要的一點是:
一共需要從資料庫取出的資料一共有多少條!!!
此時,我們就需要用到python中的一個內建方法divmod:它是功能是一個數除以另一個數時,返回餘數和商!!如:
>>> divmod(100,10) (10, 0) # 10頁 >>> divmod(101,10) (10, 1) # 11頁 >>> divmod(99,10) (9, 9) # 10頁 # 餘數只要不是0就需要在第一個數位上加一
我們可以用它來判斷我們一共需要多少頁!
後端自定義分頁器邏輯詳解: def book(request): if request.method == 'GET': current_page = request.GET.get('page',1) # 獲取使用者需要存取的頁面,如果沒有預設返回1 try: #異常捕獲,因為前端返回的都是字串,需要把他們都轉成數位型別,方便下面做運算操作 current_page = int(current_page) except Exception as e: current_page = 1 # 使用者輸入啥字母等也預設為1 per_page_num = 10 #每頁展示多少條資料 start_page = (current_page - 1) * per_page_num #當前頁數起始資料 end_page = current_page * per_page_num #當前頁結束資料 book_num = models.Book.objects.all() #將所有資料查詢出來 all_count = book_num.count() # 統計一共有多少資料 num,more = divmod(all_count,per_page_num) #divmod方法計算需要的總頁數 if more: all_page = num + 1 #more為餘數,餘為0,則剛剛好是num頁數,不為0,則頁數加1 # 然後我們需要在html頁面的分頁器標籤部分,for迴圈一下總共需要的num頁數,但是有一個問題是,前端無法使用range() # 這就需要我們在後端進行迴圈,再傳到前端 html = '' a = current_page # 為了下面頁碼高亮調整 if current_page <6: #當頁面小於6時,固定在6上面,為下面的for處理不出現頁碼負數 current_page = 6 # 存取第6頁時,只會顯示當前頁-5和+6的底部頁碼數,但是當頁面小於6時,頁碼會出現0甚至負數,所有我們需要對頁面進行一個設定,就是上述的a for i in range(current_page-5,current_page+6): if a == i: # 當前頁的頁面高亮顯示 html += '<li class="active"><a href="?page=%s" rel="external nofollow" rel="external nofollow" >%s</a></li>' % (i, i) else: html += '<li><a href="?page=%s" rel="external nofollow" rel="external nofollow" >%s</a></li>' % (i, i) book_queryset = book_num[start_page:end_page] return render(request,'book.html',locals())
前端頁面部分: <nav aria-label="Page navigation"> <ul class="pagination"> <li> <a href="#" rel="external nofollow" rel="external nofollow" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li> {{ html|safe }} <li> <a href="#" rel="external nofollow" rel="external nofollow" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> </ul> </nav>
封裝好的分液器
後端
def get_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] return render(request,'booklist.html',locals())
前端
<div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> {% for book in page_queryset %} <p>{{ book.title }}</p> {% endfor %} {{ page_obj.page_html|safe }} </div> </div> </div>
到此這篇關於django中的自定義分頁器的實現範例的文章就介紹到這了,更多相關django 自定義分頁器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45