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抓取Discuz!用户名脚本代码
Dec 30 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
Python字符串的一些操作方法总结
Jun 10 Python
Python获取数据库数据并保存在excel表格中的方法
Jun 12 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 Python
解决python 读取 log日志的编码问题
Dec 24 Python
学习Python需要哪些工具
Sep 04 Python
Python办公自动化解决world文件批量转换
Sep 15 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 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
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
js 分页全选或反选标识实现代码
2011/08/09 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
python关于变量名的基础知识点
2020/03/03 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
如何高效率的查找一个月以内的数据
2012/04/15 面试题
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
商务日语毕业生自荐信范文
2013/11/14 职场文书
个人教师自我评价范文
2013/12/02 职场文书
优秀毕业生求职信范文
2014/01/02 职场文书
入党转预备思想汇报
2014/01/07 职场文书
初中地理教学反思
2014/01/11 职场文书
5.1手机促销活动
2014/01/17 职场文书
党建目标管理责任书
2014/07/25 职场文书
辞职信范文大全
2015/03/02 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android