Django如何自定义分页


Posted in Python onSeptember 25, 2018

本文实例为大家分享了Django自定义分页的具体代码,供大家参考,具体内容如下

稳扎稳打版

def book(request):
 # 从URL取参数(访问的页码)
 page_num = request.GET.get("page")
 try:
 # 将取出的page转换为int类型
 page_num = int(page_num)
 except Exception as e:
 # 当输入的页码不是正经数字的时候 默认返回第一页的数据
 page_num = 1

 # 数据库总数据是多少条
 total_count = models.Book.objects.all().count()

 # 每一页显示多少条数据
 per_page = 10

 # 总共需要多少页码来展示
 total_page, m = divmod(total_count, per_page)
 if m:
 total_page += 1

 # 如果输入的页码数超过了最大的页码数,默认返回最后一页
 if page_num > total_page:
 page_num = total_page

 # 定义两个变量从哪里开始到哪里结束
 data_start = (page_num - 1) * 10
 data_end = page_num * 10

 # 页面上总共展示多少页码
 max_page = 11
 if total_page < max_page:
 max_page = total_page

 # 把从URL中获取的page_num 当做是显示页面的中间值, 那么展示的便是当前page_num 的前五页和后后五页
 half_max_page = max_page // 2
 # 根据展示的总页码算出页面上展示的页码从哪儿开始
 page_start = page_num - half_max_page
 # 根据展示的总页码算出页面上展示的页码到哪儿结束
 page_end = page_num + half_max_page

 # 如果当前页减一半 比1还小, 不然页面上会显示负数的页码
 if page_start <= 1:
 page_start = 1
 page_end = max_page
 # 如果 当前页 加 一半 比总页码数还大, 不然页面上会显示比总页码还大的多余页码
 if page_end >= total_page:
 page_end = total_page
 page_start = total_page - max_page + 1

 # 从数据库取值, 并按照起始数据到结束数据展示
 all_book = models.Book.objects.all()[data_start:data_end]


 # 自己拼接分页的HTML代码
 html_str_list = []

 # # 加上首页
 html_str_list.append('<li><a href="/book/?page=1" rel="external nofollow" >首页</a></li>')

 # 断一下 如果是第一页,就没有上一页
 if page_num <= 1:
 html_str_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">«</span></a></li>')
 else:
 # 不是第一页,就加一个上一页的标签
 html_str_list.append('<li><a href="/book/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">«</span></a></li>'.format(page_num - 1))

 for i in range(page_start, page_end + 1):
 # 如果是当前页就加一个active样式类
 if i == page_num:
  tmp = '<li class="active"><a href="/book/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)
 else:
  tmp = '<li><a href="/book/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)

 html_str_list.append(tmp)

 # 判断,如果是最后一页,就没有下一页
 if page_num >= total_page:
 html_str_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>')
 else:
 # 不是最后一页, 就加一个下一页标签
 html_str_list.append('<li><a href="/book/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>'.format(page_num + 1))

 # 加上尾页
 html_str_list.append('<li><a href="/book/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(total_page))

 page_html = "".join(html_str_list)
 return render(request, "book.html", {"all_book":all_book, "page_html":page_html})

book.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>书籍列表</title>
 <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<table class="table table-bordered">
 <thead>
 <tr>
  <th>序列号</th>
  <th>ID值</th>
  <th>书名</th>
  <th>时间</th>
 </tr>
 {% for book in all_book %}
 <tr>
  <td>{{ forloop.counter }}</td>
  <td>{{ book.id }}</td>
  <td>{{ book.name }}</td>
  <td>{{ book.date }}</td>
 </tr>
 {% endfor %}
 </thead>
</table>
<nav aria-label="Page navigation">
 <ul class="pagination">
 {{ page_html|safe }}
 </ul>
</nav>
</div>
</body>
</html>

封装保存版

封装保存版

class Page(object):
 def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
 """
 :param page_num: 当前页码数
 :param total_count: 数据总数
 :param url_prefix: a标签href的前缀
 :param per_page: 每页显示多少条数据
 :param max_page: 页面上最多显示几个页码
 """
 self.url_prefix = url_prefix
 self.max_page = max_page
 # 总共需要多少页码来展示
 total_page, m = divmod(total_count, per_page)
 if m:
  total_page += 1
 self.total_page = total_page

 try:
  # 将取出的page转换为int类型
  page_num = int(page_num)
 except Exception as e:
  # 当输入的页码不是正经数字的时候 默认返回第一页的数据
  page_num = 1
 # 如果输入的页码数超过了最大的页码数,默认返回最后一页
 if page_num > total_page:
  page_num = total_page
 self.page_num = page_num

 # 定义两个变量保存数据从哪儿取到哪儿
 self.data_start = (page_num - 1) * 10
 self.data_end = page_num * 10

 # 页面上总共展示多少页码
 if total_page < self.max_page:
  self.max_page = total_page

 half_max_page = self.max_page // 2
 # 页面上展示的页码从哪儿开始
 page_start = page_num - half_max_page
 # 页面上展示的页码到哪儿结束
 page_end = page_num + half_max_page
 # 如果当前页减一半 比1还小, 不然页面上会显示负数的页码
 if page_start <= 1:
  page_start = 1
  page_end = self.max_page
 # 如果 当前页 加 一半 比总页码数还大, 不然页面上会显示比总页码还大的多余页码
 if page_end >= total_page:
  page_end = total_page
  page_start = total_page - self.max_page + 1
 self.page_start = page_start
 self.page_end = page_end

 @property
 def start(self):
 return self.data_start

 @property
 def end(self):
 return self.data_end

 def page_html(self):
 # 自己拼接分页的HTML代码
 html_str_list = []
 # # 加上首页
 html_str_list.append('<li><a href="{}?page=1">首页</a></li>'.format(self.url_prefix))
 # 断一下 如果是第一页,就没有上一页
 if self.page_num <= 1:
  html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">«</span></a></li>')
 else:
  # 不是第一页,就加一个上一页的标签
  html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">«</span></a></li>'.format(self.url_prefix, self.page_num - 1))

 for i in range(self.page_start, self.page_end + 1):
  # 如果是当前页就加一个active样式类
  if i == self.page_num:
  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)

  html_str_list.append(tmp)

 # 判断,如果是最后一页,就没有下一页
 if self.page_num >= self.total_page:
  html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">»</span></a></li>')
 else:
  # 不是最后一页, 就加一个下一页标签
  html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">»</span></a></li>'.format(self.url_prefix, self.page_num + 1))

 # 加上尾页
 html_str_list.append('<li><a href="{}?page={}">尾页</a></li>'.format(self.url_prefix, self.total_page))

 page_html = "".join(html_str_list)
 return page_html

封装版使用指南

def publisher(request):
 page_num = request.GET.get("page")
 total_count = models.Publisher.objects.all().count()
 # 调用封装的Page类,传入相应的参数
 page_obj = Page(page_num, total_count, url_prefix="/publisher/", per_page=10, max_page=11)
 all_publisher = models.Publisher.objects.all()[page_obj.start:page_obj.end]
 page_html = page_obj.page_html()
 return render(request, "publisher.html", {"publisher": all_publisher, "page_html": page_html})

封装版对应的HTML参考

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>图书列表</title>
 <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
</head>
<body>
<div class="container">
 <table class="table table-bordered">
 <thead>
 <tr>
  <td>序列号</td>
  <td>ID值</td>
  <td>出版社</td>
  <td>时间</td>
 </tr>
 </thead>
 <tbody>
 {% for pub in publisher %}
  <tr>
  <th>{{ forloop.counter }}</th>
  <th>{{ pub.id }}</th>
  <th>{{ pub.name }}</th>
  <th>{{ pub.date }}</th>
  </tr>
 {% endfor %}
 </tbody>
 </table>
 <nav aria-label="Page navigation">
 <ul class="pagination">
  {{ page_html|safe }}
 </ul>
 </nav>
</div>
</body>
</html>

效果图如下:

Django如何自定义分页

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
学习python (2)
Oct 31 Python
python使用正则表达式提取网页URL的方法
May 26 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 Python
老生常谈python中的重载
Nov 11 Python
超全Python图像处理讲解(多模块实现)
Apr 13 Python
使用Python构造hive insert语句说明
Jun 06 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
Django celery异步任务实现代码示例
Nov 26 Python
pytorch MSELoss计算平均的实现方法
May 12 Python
使用python生成大量数据写入es数据库并查询操作(2)
Sep 23 Python
Python使用googletrans报错的解决方法
Sep 25 #Python
Python实现简单的用户交互方法详解
Sep 25 #Python
Python中反射和描述器总结
Sep 23 #Python
python3实现爬取淘宝美食代码分享
Sep 23 #Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 #Python
Python实现注册、登录小程序功能
Sep 21 #Python
用于业余项目的8个优秀Python库
Sep 21 #Python
You might like
php自定义session示例分享
2014/04/22 PHP
JavaScript中的方法重载实例
2015/03/16 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
Numpy数据类型转换astype,dtype的方法
2018/06/09 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
党员自我评价分享
2013/12/13 职场文书
洗煤厂厂长岗位职责
2014/01/03 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
幼教求职信
2014/03/12 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
市级三好生竞选稿
2015/11/21 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python
SQL中的三种去重方法小结
2021/11/01 SQL Server
js作用域及作用域链工作引擎
2022/07/07 Javascript