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实现Const详解
Jan 27 Python
详细解读Python中的__init__()方法
May 02 Python
Python实现二叉搜索树
Feb 03 Python
python3实现公众号每日定时发送日报和图片
Feb 24 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
实例讲解Python3中abs()函数
Feb 19 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 Python
Django缓存Cache使用详解
Nov 30 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 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/01 无线电
PHP中include()与require()的区别说明
2010/03/10 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
2018/10/16 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
django使用图片延时加载引起后台404错误
2017/04/18 Python
python万年历实现代码 含运行结果
2017/05/20 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
超简单使用Python换脸实例
2019/03/27 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
银行自荐信范文
2013/10/07 职场文书
精彩的大学生自我评价
2013/11/17 职场文书
车工岗位职责
2013/11/26 职场文书
仓库保管员岗位职责
2013/12/20 职场文书
市场营销职业生涯规划书范文
2014/01/12 职场文书
大学运动会入场词
2014/02/22 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
2014年接待工作总结
2014/11/26 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
JS实现九宫格拼图游戏
2022/06/28 Javascript
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript