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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django内置的分页模块

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django内置的分页模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自定義分頁

未封裝版:

  • 優點:直觀
  • 缺點:代碼亂,不易維護,可拓展性差
data = []for i in range(1, 302):tmp = {"id": i, "name": "alex-{}".format(i)}data.append(tmp)print(data)def user_list(request):# user_list = data[0:10]# user_list = data[10:20]try:current_page = int(request.GET.get("page"))except Exception as e:current_page = 1per_page = 10# 數據總條數total_count = len(data)# 總頁碼total_page, more = divmod(total_count, per_page)if more:total_page += 1# 頁面最多顯示多少個頁碼max_show = 11half_show = int((max_show-1)/2)if current_page <= half_show:show_start = 1show_end = max_showelse:if current_page + half_show >= total_page:show_start = total_page - max_showshow_end = total_pageelse:show_start = current_page - half_showshow_end = current_page + half_show# 數據庫中獲取數據data_start = (current_page - 1) * per_pagedata_end = current_page * per_pageuser_list = data[data_start:data_end]# 生成頁面上顯示的頁碼page_html_list = []# 加首頁first_li = '<li><a href="/user_list/?page=1">首頁</a></li>'page_html_list.append(first_li)# 加上一頁if current_page == 1:prev_li = '<li><a href="#">上一頁</a></li>'else:prev_li = '<li><a href="/user_list/?page={}">上一頁</a></li>'.format(current_page - 1)page_html_list.append(prev_li)for i in range(show_start, show_end+1):if i == current_page:li_tag = '<li class="active"><a href="/user_list/?page={0}">{0}</a></li>'.format(i)else:li_tag = '<li><a href="/user_list/?page={0}">{0}</a></li>'.format(i)page_html_list.append(li_tag)# 加下一頁if current_page == total_page:next_li = '<li><a href="#">下一頁</a></li>'else:next_li = '<li><a href="/user_list/?page={}">下一頁</a></li>'.format(current_page+1)page_html_list.append(next_li)# 加尾頁page_end_li = '<li><a href="/user_list/?page={}">尾頁</a></li>'.format(total_page)page_html_list.append(page_end_li)page_html = "".join(page_html_list)return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

  

封裝版:

  • 優點:易維護、可拓展性強
  • 缺點:邏輯相對復雜
""" 自定義分頁組件 """ class Pagination(object):def __init__(self, data_num, current_page, url_prefix, per_page=10, max_show=11):"""進行初始化.:param data_num: 數據總數:param current_page: 當前頁:param url_prefix: 生成的頁碼的鏈接前綴:param per_page: 每頁顯示多少條數據:param max_show: 頁面最多顯示多少個頁碼"""self.data_num = data_numself.per_page = per_pageself.max_show = max_showself.url_prefix = url_prefix# 把頁碼數算出來self.page_num, more = divmod(data_num, per_page)if more:self.page_num += 1try:self.current_page = int(current_page)except Exception as e:self.current_page = 1# 如果URL傳過來的頁碼數是負數if self.current_page <= 0:self.current_page = 1# 如果URL傳過來的頁碼數超過了最大頁碼數elif self.current_page > self.page_num:self.current_page = self.page_num # 默認展示最后一頁# 頁碼數的一半 算出來self.half_show = max_show // 2# 頁碼最左邊顯示多少if self.current_page - self.half_show <= 1:self.page_start = 1self.page_end = self.max_showelif self.current_page + self.half_show >= self.page_num: # 如果右邊越界self.page_end = self.page_numself.page_start = self.page_num - self.max_showelse:self.page_start = self.current_page - self.half_show# 頁碼最右邊顯示self.page_end = self.current_page + self.half_showif self.page_num < self.page_end:self.page_end = self.page_num # 如果總頁面小于結束頁面,那么結束頁面即為總頁碼@propertydef start(self):# 數據從哪兒開始切return (self.current_page - 1) * self.per_page@propertydef end(self):# 數據切片切到哪兒return self.current_page * self.per_pagedef page_html(self):# 生成頁碼l = []# 加一個首頁l.append('<li><a href="{}?page=1">首頁</a></li>'.format(self.url_prefix))# 加一個上一頁if self.current_page == 1:l.append('<li class="disabled" ><a href="#">?</a></li>'.format(self.current_page))else:l.append('<li><a href="{}?page={}">?</a></li>'.format(self.url_prefix, self.current_page - 1))for i in range(self.page_start, self.page_end + 1):if i == self.current_page:tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)else:tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)l.append(tmp)# 加一個下一頁if self.current_page == self.page_num:l.append('<li class="disabled"><a href="#">?</a></li>'.format(self.current_page))else:l.append('<li><a href="{}?page={}">?</a></li>'.format(self.url_prefix, self.current_page + 1))# 加一個尾頁l.append('<li><a href="{}?page={}">尾頁</a></li>'.format(self.url_prefix, self.page_num))return "".join(l)

?封裝版使用步驟:

  • 將上面的一段代碼復制到自定義的模塊(pt文件)中
  • 導入自定義模塊
  • 在views系統的函數里寫入以下代碼 def user_list(request):# 實例化一個分頁類的對象obj = Pagination(blogs.count(),page,'blogs.html')# 根據傳入的總博客數、頁碼獲取當頁需要展示的博客blog_list = blogs[obj.start:obj.end]# 根據傳入的博客數及頁碼獲取生成分頁的html格式的頁碼列表page_html = pager.page_html()#返回指定頁面return render(request, "blog_list.html", {"blog_list": blog_list, "page_html": page_html})

      

  • 在需要生成頁面的html頁面寫入以下代碼 <div class="topicListFooter fenye"><ul class="pagination">{{ page_html|safe }}</ul></div>

      注:示例中用的是bootstrap分頁樣式

  • Django中的內置分頁(不能展示頁碼列表)

    from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerL = [] for i in range(999):L.append(i)def index(request):current_page = request.GET.get('p')paginator = Paginator(L, 10)# per_page: 每頁顯示條目數量# count: 數據總個數# num_pages:總頁數# page_range:總頁數的索引范圍,如: (1,10),(1,200)# page: page對象try:posts = paginator.page(current_page)# has_next 是否有下一頁# next_page_number 下一頁頁碼# has_previous 是否有上一頁# previous_page_number 上一頁頁碼# object_list 分頁之后的數據列表# number 當前頁# paginator paginator對象except PageNotAnInteger:posts = paginator.page(1)except EmptyPage:posts = paginator.page(paginator.num_pages)return render(request, 'index.html', {'posts': posts})內置分頁view部分

      

    <!DOCTYPE html> <html> <head lang="en"><meta charset="UTF-8"><title></title> </head> <body> <ul>{% for item in posts %}<li>{{ item }}</li>{% endfor %} </ul><div class="pagination"><span class="step-links">{% if posts.has_previous %}<a href="?p={{ posts.previous_page_number }}">Previous</a>{% endif %}<span class="current">Page {{ posts.number }} of {{ posts.paginator.num_pages }}.</span>{% if posts.has_next %}<a href="?p={{ posts.next_page_number }}">Next</a>{% endif %}</span></div> </body> </html>內置分頁HTML部分

      

    轉載于:https://www.cnblogs.com/fu-yong/p/8729436.html

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的Django内置的分页模块的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。