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 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
python使用marshal模块序列化实例
Sep 25 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
django实现前后台交互实例
Aug 07 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
windows支持哪个版本的python
Jul 03 Python
python脚本定时发送邮件
Dec 22 Python
教你怎么用Python生成九宫格照片
May 20 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学习之PHP表达式
2006/10/09 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
javascript按顺序加载运行js方法
2017/12/01 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python Web flask 视图内容和模板实现代码
2019/08/23 Python
Python如何读取、写入JSON数据
2020/07/28 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
计算机求职信
2014/07/02 职场文书
小学生植树节活动总结
2014/07/04 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
红白喜事主持词
2015/07/06 职场文书
生日祝酒词大全
2015/08/10 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript
JavaScript异步操作中串行和并行
2021/11/20 Javascript
LeetCode189轮转数组python示例
2022/08/05 Python