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 截取 取出一部分的字符串方法
Mar 01 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
解决pyecharts在jupyter notebook中使用报错问题
Apr 23 Python
Python自定义一个异常类的方法
Jun 27 Python
pandas的排序和排名的具体使用
Jul 31 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
python函数map()和partial()的知识点总结
May 26 Python
Django serializer优化类视图的实现示例
Jul 16 Python
python给视频添加背景音乐并改变音量的具体方法
Jul 19 Python
python 对象真假值的实例(哪些视为False)
Dec 11 Python
Python爬虫 简单介绍一下Xpath及使用
Apr 26 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如何将log信息写入服务器中的log文件
2015/07/29 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
jQuery常见开发技巧详细整理
2013/01/02 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
python对数组进行反转的方法
2015/05/20 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
基于python的Tkinter编写登陆注册界面
2017/06/30 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
小学国庆节活动方案
2014/02/11 职场文书
建筑工地宣传标语
2014/06/18 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
公司委托书怎么写
2014/08/02 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
作文评语怎么写
2014/12/25 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
人与自然的观后感
2015/06/18 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
装修安全责任协议书
2016/03/22 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS