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中的闭包总结
Sep 18 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
PyQt5实现拖放功能
Apr 25 Python
Django实现全文检索的方法(支持中文)
May 14 Python
Python爬虫文件下载图文教程
Dec 23 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
pytorch标签转onehot形式实例
Jan 02 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 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设计模式 Interpreter(解释器模式)
2011/06/26 PHP
PHP数组实例总结与说明
2011/08/23 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
Python读取word文本操作详解
2018/01/22 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
linux面试相关问题
2013/04/28 面试题
仓库管理专业个人自我评价范文
2013/11/11 职场文书
高二英语教学反思
2014/01/19 职场文书
三年大学生活自我鉴定
2014/01/21 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
出生证明范本
2015/06/15 职场文书
欠款证明
2015/06/24 职场文书
任命书格式范文
2015/09/22 职场文书
年终工作总结范文
2019/06/20 职场文书
七年级作文之英语老师
2019/10/28 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python