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脚本将绝对url替换为相对url的教程
Apr 24 Python
python获取文件扩展名的方法
Jul 06 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
python看某个模块的版本方法
Oct 16 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
Python reversed函数及使用方法解析
Mar 17 Python
Python Selenium XPath根据文本内容查找元素的方法
Dec 07 Python
如何用Python提取10000份log中的产品信息
Jan 14 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(4) php 函数 补充2
2010/02/15 PHP
yii操作cookie实例简介
2014/07/09 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
jQuery 使用个人心得
2009/02/26 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
2013/11/08 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
python绘制彩虹图
2019/12/16 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
高级电工工作职责
2013/11/21 职场文书
法院信息化建设方案
2014/05/21 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL