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实现数通设备端口监控示例
Apr 02 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
python连接PostgreSQL过程解析
Feb 09 Python
Python如何存储数据到json文件
Mar 09 Python
Python偏函数Partial function使用方法实例详解
Jun 17 Python
pytorch model.cuda()花费时间很长的解决
Jun 01 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
python scrapy简单模拟登录的代码分析
Jul 21 Python
python可视化之颜色映射详解
Sep 15 Python
Python实现归一化算法详情
Mar 18 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程序
2006/10/09 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
Javascript 日期处理之时区问题
2009/10/08 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
Python与R语言的简要对比
2017/11/14 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
Python多继承原理与用法示例
2018/08/23 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
工商管理毕业生推荐信
2013/12/24 职场文书
员工合理化建议书
2014/05/19 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL