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连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
在Python中使用判断语句和循环的教程
Apr 25 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
Python常见异常分类与处理方法
Jun 04 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
Nov 14 Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
Python使用numpy模块创建数组操作示例
Jun 20 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
Python检查ping终端的方法
Jan 26 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 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
PHP中GET变量的使用
2006/10/09 PHP
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
javascript 数组操作详解
2015/01/29 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
python之import机制详解
2014/07/03 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python实现中值滤波去噪方式
2019/12/18 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
PHP面试题附答案
2015/11/28 面试题
应用数学自荐书范文
2013/11/24 职场文书
四年大学生活的个人自我评价
2013/12/11 职场文书
班班通项目实施方案
2014/02/25 职场文书
经典促销广告词大全
2014/03/19 职场文书
图书馆标语
2014/06/19 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
个人工作总结范文2014
2014/11/07 职场文书
病房管理制度范本
2015/08/06 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS