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使用自定义user-agent抓取网页的方法
Apr 15 Python
多版本Python共存的配置方法
May 22 Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
django反向解析和正向解析的方式
Jun 05 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
pytorch多GPU并行运算的实现
Sep 27 Python
基于python实现简单网页服务器代码实例
Sep 14 Python
python 如何上传包到pypi
Dec 24 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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实现的生成静态HTML速度快类库
2007/03/31 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP随机数生成代码与使用实例分析
2011/04/08 PHP
php操作xml
2013/10/27 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
Firefox window.close()的使用注意事项
2009/04/11 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
Python3中exp()函数用法分析
2019/02/19 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
什么是SCM(软件配置管理)
2014/08/16 面试题
培训计划通知
2015/07/15 职场文书
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
golang生成并解析JSON
2022/04/14 Golang
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android