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 22 Python
Python多线程原理与用法详解
Aug 20 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
为什么Python中没有&quot;a++&quot;这种写法
Nov 27 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
用django设置session过期时间的方法解析
Aug 05 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
Django设置Postgresql的操作
May 14 Python
Python函数参数定义及传递方式解析
Jun 10 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聊天室技术
2006/10/09 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
Jquery异步请求数据实例代码
2011/12/28 Javascript
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
写一个Vue loading 插件
2020/11/09 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Python循环结构的应用场景详解
2019/07/11 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
我未来的职业规划范文
2014/01/11 职场文书
名人演讲稿范文
2014/09/16 职场文书
教师节标语大全
2014/10/07 职场文书
婚前协议书范本
2014/10/27 职场文书
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏