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查看多台服务器进程的脚本分享
Jun 11 Python
python urllib urlopen()对象方法/代理的补充说明
Jun 29 Python
Python数据结构与算法之字典树实现方法示例
Dec 13 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 Python
python实现画循环圆
Nov 23 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
在TensorFlow中实现矩阵维度扩展
May 22 Python
记一次Django响应超慢的解决过程
Sep 17 Python
Python timeit模块原理及使用方法
Oct 10 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 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中include()与require()的区别说明
2010/03/10 PHP
PHP5 字符串处理函数大全
2010/03/23 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP中的替代语法简介
2014/08/22 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
更优雅的事件触发兼容
2011/10/24 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
python迭代器的使用方法实例
2013/11/21 Python
python计算一个序列的平均值的方法
2015/07/11 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
专科应届毕业生求职信
2014/06/04 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
教师党员整改措施
2014/10/24 职场文书
法律意见书范文
2015/06/04 职场文书
钢琴师观后感
2015/06/12 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
毕业欢送会致辞
2015/07/29 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
sql字段解析器的实现示例
2021/06/23 SQL Server