Python Django 封装分页成通用的模块详解


Posted in Python onAugust 21, 2019

这篇文章主要介绍了Python Django 封装分页成通用的模块详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

新建 utils 文件夹,并创建 page.py

Python Django 封装分页成通用的模块详解

page.py:

class ShowPage(object):
  def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
    '''
    :param page_num: 当前页码数
    :param total_count: 数据总数
    :param url_prefix: a 标签 href 的前缀
    :param per_page: 每页展示的数据数
    :param max_page: 页面上最多显示的页码数
    '''
    self.url_prefix = url_prefix
    self.max_page = max_page
    # 总共需要多少页码来显示
    total_page, m = divmod(total_count, per_page) 
    # 如果还有数据
    if m:
      total_page += 1
    self.total_page = total_page 
    try:
      page_num = int(page_num)
      # 如果输入的页码数超过了最大的页码数,默认返回最后一页
      if page_num > self.total_page:
        page_num = self.total_page
      # 如果输入的页码数小于 1,则返回第一页
      if page_num < 1:
        page_num = 1
    except Exception as e:
      # 当输入的页码不是正经数字的时候 默认返回第一页的数据
      page_num = 1
    self.page_num = page_num 
    # 定义两个变量保存数据从哪儿取到哪儿
    self.data_start = (self.page_num - 1) * 10
    self.data_end = self.page_num * 10 
    # 页面上总共展示多少页码
    if self.total_page < self.max_page:
      self.max_page = self.total_page 
    half_max_page = self.max_page // 2 
    # 页面上展示的页码的开始页
    page_start = self.page_num - half_max_page
    # 页面上展示的页码的结束页
    page_end = self.page_num + half_max_page
    # 如果当前页减一半比 1 还小
    if page_start <= 1:
      page_start = 1
      page_end = self.max_page
    # 如果当前页加一半比总页码还大
    if page_end >= self.total_page:
      page_end = self.total_page
      page_start = self.total_page - self.max_page + 1
    self.page_start = page_start
    self.page_end = page_end 
  @property
  def start(self):
    return self.data_start 
  @property
  def end(self):
    return self.data_end 
  def page_html(self):
    # 拼接 html 的分页代码
    html_list = [] 
    # 添加首页按钮
    html_list.append('<li><a href="{}?page=1" rel="external nofollow" >首页</a></li>'.format( self.url_prefix)) 
    # 如果是第一页,就没有上一页
    if self.page_num <= 1:
      html_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">«</span></a></li>'.format(self.page_num - 1))
    else:
      # 加一个上一页的标签
      html_list.append('<li><a href="{}?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">«</span></a></li>'.format(self.url_prefix, self.page_num-1))
    # 展示的页码
    for i in range(self.page_start, self.page_end + 1):
      # 给当前页添加 active
      if i == self.page_num:
        tmp = '<li class="active"><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" >{1}</a></li>'.format(self.url_prefix, i)
      else:
        tmp = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" >{1}</a></li>'.format(self.url_prefix, i)
      html_list.append(tmp) 
    # 如果是最后一页,就没有下一页
    if self.page_num >= self.total_page:
      html_list.append('<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>')
    else:
      html_list.append(
        '<li><a href="{}?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span aria-hidden="true">»</span></a></li>'.format(self.url_prefix, self.page_num + 1)) 
    # 添加尾页按钮
    html_list.append('<li><a href="{}?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(self.url_prefix, self.total_page))
 
    page_html = "".join(html_list) # 拼接 html 的分页代码
    return page_html

views.py:

from django.shortcuts import render
from app01 import models 
def book_list(request):
  # 从URL取参数
  page_num = request.GET.get("page")
  print(page_num, type(page_num)) 
  # 书籍总数
  total_count = models.Book.objects.all().count()
  # 导入显示页码的函数
  from utils.page import ShowPage
  page_obj = ShowPage(page_num, total_count, per_page=10, url_prefix="/book_list/", max_page=11, ) 
  ret = models.Book.objects.all()[page_obj.start:page_obj.end]
  print(ret) 
  page_html = page_obj.page_html()
  return render(request, "book_list.html", {"books": ret, "page_html": page_html})

book_list.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>书籍列表</title>
  <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.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.title }}</td>
      </tr>
    {% endfor %}
 
    </tbody>
  </table> 
  <nav aria-label="Page navigation">
    <ul class="pagination">
      <li>
        {{ page_html|safe }}
      </li>
    </ul>
  </nav> 
</div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用xmlrpc实例讲解
Dec 17 Python
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
python实现可逆简单的加密算法
Mar 22 Python
python集合是否可变总结
Jun 20 Python
python实现桌面气泡提示功能
Jul 29 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
python实现简单区块链结构
Apr 25 Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 #Python
python numpy 常用随机数的产生方法的实现
Aug 21 #Python
在django模板中实现超链接配置
Aug 21 #Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 #Python
Django 在iframe里跳转顶层url的例子
Aug 21 #Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 #Python
django写用户登录判定并跳转制定页面的实例
Aug 21 #Python
You might like
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
python 网络爬虫初级实现代码
2016/02/27 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
python实现人民币大写转换
2018/06/20 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
Python turtle画图库&amp;&amp;画姓名实例
2020/01/19 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
python输出数学符号实例
2020/05/11 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
J2EE相关知识面试题
2013/08/26 面试题
村委会换届选举方案
2014/05/03 职场文书
拓展训练激励口号
2014/06/17 职场文书
应届生自荐书
2014/06/23 职场文书
与美同行演讲稿
2014/09/13 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL