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格式化css文件的方法
Mar 10 Python
Python中列表和元组的使用方法和区别详解
Dec 30 Python
python回调函数中使用多线程的方法
Dec 25 Python
python3爬取各类天气信息
Feb 24 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
TensorFlow实现iris数据集线性回归
Sep 07 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
django中的图片验证码功能
Sep 18 Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 Python
Python unittest单元测试框架实现参数化
Apr 29 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 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
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
php重定向的三种方法分享
2012/02/22 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
解析php常用image图像函数集
2013/06/24 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
python 实现任务管理清单案例
2020/04/25 Python
零基础学python应该从哪里入手
2020/08/11 Python
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
办公室综合文员岗位职责范本
2014/02/13 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
感谢信格式范文
2015/01/22 职场文书
人才市场接收函
2015/01/30 职场文书
青春雷锋观后感
2015/06/10 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
Python+Tkinter制作专属图形化界面
2022/04/01 Python