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编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
深入理解python中的atexit模块
Mar 07 Python
python自定义异常实例详解
Jul 11 Python
浅谈django开发者模式中的autoreload是如何实现的
Aug 18 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
将python代码和注释分离的方法
Apr 21 Python
Python返回数组/List长度的实例
Jun 23 Python
浅谈dataframe中更改列属性的方法
Jul 10 Python
django用户登录和注销的实现方法
Jul 16 Python
tensorflow实现残差网络方式(mnist数据集)
May 26 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 Python
在pyCharm中下载第三方库的方法
Apr 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
一个PHP日历程序
2006/12/06 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
python根据多个文件名批量查找文件
2019/08/13 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
keras中的卷积层&amp;池化层的用法
2020/05/22 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
Java程序员面试90题
2013/10/19 面试题
感恩寄语大全
2014/04/11 职场文书
竞聘演讲稿
2014/04/24 职场文书
秋菊打官司观后感
2015/06/03 职场文书
警示教育观后感
2015/06/17 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
导游词之唐山景点
2019/12/18 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫