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实现图书超期提醒
Aug 02 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
django缓存配置的几种方法详解
Jul 16 Python
详解python中init方法和随机数方法
Mar 13 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
利用Python实现自动扫雷小脚本
Dec 17 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
Elasticsearch 基本查询和组合查询
Apr 19 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为SHOPEX增加日志功能代码
2010/07/02 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
javaScript知识点总结(必看篇)
2016/06/10 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
python多线程方式执行多个bat代码
2016/06/07 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
Python requests上传文件实现步骤
2020/09/15 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
电大自我鉴定
2013/10/27 职场文书
报到证丢失证明
2014/01/11 职场文书
小小的船教学反思
2014/02/21 职场文书
遗产继承公证书
2014/04/09 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
财务经理岗位职责
2015/01/31 职场文书
护士个人年度总结范文
2015/02/13 职场文书
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫