Django框架实现的分页demo示例


Posted in Python onMay 25, 2019

本文实例讲述了Django框架实现的分页。分享给大家供大家参考,具体如下:

首先初始化model,建表

class Book(models.Model):
  name = models.CharField(max_length=20)
  def __str__(self):
    return self.name
  class Meta:
    db_table = 'books'

然后用pycharm的数据库模块可视化插入

分页思路

url传递参数http://127.0.0.1:8000/books/?page=5比如这样传递的参数就是5,就显示第五页,

1.get到所有图书对象

2.计算好每一页应该有几个数据

3.根据不同的page值传递

def books(request):
  #取从url传递的参数
  page_num = request.GET.get('page')
  page_num = int(page_num)
  start = (page_num-1)*5
  end = page_num*5
  #总页码数是?
  per_page = 5
  total = models.Book.objects.all().count()
  total,more =divmod(total,per_page)
  if more:
    total+=1
  all_books = models.Book.objects.all()[start:end]
  #自己拼接分页的html代码
  html_str_list = []
  for i in range(1,total):
    tmp = '<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{}</li>'.format(i,i)
    html_str_list.append(tmp)
  page_html = "".join(html_str_list)
  return render(request,'books.html',{'books':all_books,'total_page':total,'page_html':page_html})

拿到数据总量的值,每一页的数量为5,如果有余数则total+1也就是增加一个页面.

建立一个列表,去拼接a标签,最后传递给前端

前端

前端的样式用到了boottrap,可以直接看文档.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>书记列表</title>
  <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css" rel="external nofollow" >
</head>
<body>
<div class="container">
  <table class="table table-bordered">
    <thead>
    <tr>
      <th>序号</th>
      <th>id</th>
      <th>书名</th>
    </tr>
    </thead>
    <tbody>
    {% for book in books %}
      <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ book.id }}</td>
        <td>{{ book.name }}</td>
      </tr>
    {% endfor %}
    </tbody>
  </table>
<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>
   {{ page_html|safe }}
  <li>
   <a href="#" rel="external nofollow" rel="external nofollow" aria-label="Next">
    <span aria-hidden="true">»</span>
   </a>
  </li>
 </ul>
</nav>
</div>
</body>
</html>
{{ page_html|safe }}

传递过来的page_html要用safe过滤器,不然无法转移成html.

最终效果

Django框架实现的分页demo示例

分页优化

设置一个首页一个尾页,以及显示局部的页面

def books(request):
  # 取从url传递的参数
  page_num = request.GET.get('page')
  page_num = int(page_num)
  start = (page_num - 1) * 5
  end = page_num * 5
  # 总页码数是?
  per_page = 5
  # 页面上总共展示多少页面
  max_page = 11
  half_max_page = max_page // 2
  # 页面上展示的页面从哪开始
  page_start = page_num - half_max_page
  if page_start <= 1:
    page_start = 1
  total = models.Book.objects.all().count()
  # 页面到哪结束
  page_end = page_num+half_max_page
  if page_end > total:
    page_end = total
    page_start = total - max_page
  total, more = divmod(total, per_page)
  if more:
    total += 1
  all_books = models.Book.objects.all()[start:end]
  # 自己拼接分页的html代码
  html_str_list = []
  html_str_list.append('<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页</li>'.format(1,1))
  for i in range(page_start, page_end+1):
    tmp = '<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{}</li>'.format(i, i)
    html_str_list.append(tmp)
  html_str_list.append('<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >最后一页</li>'.format(total))
  page_html = "".join(html_str_list)
  return render(request, 'books.html', {'books': all_books, 'total_page': total, 'page_html': page_html})

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
Python中使用动态变量名的方法
May 06 Python
Python的randrange()方法使用教程
May 15 Python
Python用模块pytz来转换时区
Aug 19 Python
Python使用asyncio包处理并发详解
Sep 09 Python
python获取多线程及子线程的返回值
Nov 15 Python
python如何修改装饰器中参数
Mar 20 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
python中random模块详解
Mar 01 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
Python 正则模块详情
Nov 02 Python
Flask框架工厂函数用法实例分析
May 25 #Python
Python中Numpy mat的使用详解
May 24 #Python
Python中Numpy ndarray的使用详解
May 24 #Python
numpy数组之存取文件的实现示例
May 24 #Python
Python实现使用request模块下载图片demo示例
May 24 #Python
Python实现操纵控制windows注册表的方法分析
May 24 #Python
Django框架会话技术实例分析【Cookie与Session】
May 24 #Python
You might like
PHP编程之高级技巧——利用Mysql函数
2006/10/09 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
PHP获取POST数据的几种方法汇总
2015/03/03 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
python各种语言间时间的转化实现代码
2016/03/23 Python
django之session与分页(实例讲解)
2017/11/13 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
树莓派实现移动拍照
2019/06/22 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
Python hashlib模块实例使用详解
2019/12/24 Python
Python 日期与时间转换的方法
2020/08/01 Python
python使用建议技巧分享(三)
2020/08/18 Python
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
了解AppleShare protocol(AppleShare协议)吗
2015/08/28 面试题
2014年学校食堂工作总结
2014/11/25 职场文书
办公室主任个人总结
2015/02/28 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
JUnit5常用注解的使用
2021/07/02 Java/Android