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分割和拼接字符串
Nov 01 Python
python简单分割文件的方法
Jul 30 Python
Python的requests网络编程包使用教程
Jul 11 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
python监控键盘输入实例代码
Feb 09 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
Python中调用其他程序的方式详解
Aug 06 Python
python模块导入的方法
Oct 24 Python
python打开音乐文件的实例方法
Jul 21 Python
Python 合并拼接字符串的方法
Jul 28 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 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
在smarty中调用php内置函数的方法
2013/02/07 PHP
PHP静态文件生成类实例
2014/11/29 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
图文详解WinPE下安装Python
2016/05/17 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
旷课检讨书1000字
2014/02/14 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
党课培训心得体会
2014/09/02 职场文书
党章培训心得体会
2014/09/04 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
教师个人年度总结
2015/02/11 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
关于python类SortedList详解
2021/09/04 Python
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers