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实现排序算法
Feb 14 Python
详解Python中用于计算指数的exp()方法
May 14 Python
pandas多级分组实现排序的方法
Apr 20 Python
python flask框架实现重定向功能示例
Jul 02 Python
Python中的类与类型示例详解
Jul 10 Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
Pytorch to(device)用法
Jan 08 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
virtualenv介绍及简明教程
Jun 23 Python
Python操作Word批量生成合同的实现示例
Aug 28 Python
Visual Studio code 配置Python开发环境
Sep 11 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
用libtemplate实现静态网页生成
2006/10/09 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
PHP文件与目录操作示例
2016/12/24 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
七一表彰活动方案
2014/01/18 职场文书
俄罗斯商务邀请函
2014/01/26 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
村级四风对照检查材料
2014/08/24 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
法律意见书范本
2015/06/04 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书