Django 自定义分页器的实现代码


Posted in Python onNovember 24, 2019

为什么要实现分页?

在大部分网站中分页的功能都是必要的,尤其是在后台管理中分页更是不可或缺

分页能带给用户更好的体验,也能减轻服务器的压力

对于分页来说,有许多方法都可以实现

例如把数据全部读取出来在前端用javascript实现,但这样一次请求全部数据服务器压力很大,

还有就是在后端实现,每一次请求部分数据显示

分页需求:

1. 每页显示的多少条数据

2. 页面显示多少个页码

3. 上一页和下一页

4. 首页和尾页

效果演示:

Django 自定义分页器的实现代码

代码实现:

分页类封装:

在我的app下创建一个page.py文件,进行封装,我是先在我的app下创建了一个utils文件再创建page.py

Django 自定义分页器的实现代码

class Pagination(object):

  def __init__(self, current_page_num, all_count, request, per_page_num=10, pager_count=11):
    """
    封装分页相关数据
    :param current_page_num: 当前访问页的数字
    :param all_count:  分页数据中的数据总条数
    :param per_page_num: 每页显示的数据条数
    :param pager_count: 最多显示的页码个数
    """
    try:
      current_page_num = int(current_page_num)
    except Exception as e:
      current_page_num = 1

    if current_page_num < 1:
      current_page_num = 1

    self.current_page_num = current_page_num

    self.all_count = all_count
    self.per_page_num = per_page_num

    # 实际总页码
    all_pager, tmp = divmod(all_count, per_page_num)
    if tmp:
      all_pager += 1
    self.all_pager = all_pager

    self.pager_count = pager_count
    self.pager_count_half = int((pager_count - 1) / 2) # 5

    # 保存搜索条件
    import copy
    self.params = copy.deepcopy(request.GET) # {"a":"1","b":"2"}

  # 开始
  @property
  def start(self):
    return (self.current_page_num - 1) * self.per_page_num

  # 结束
  @property
  def end(self):
    return self.current_page_num * self.per_page_num

  # 实现
  def page_html(self):
    # 如果总页码 < 11个:
    if self.all_pager <= self.pager_count:
      pager_start = 1
      pager_end = self.all_pager + 1
    # 总页码 > 11
    else:
      # 当前页如果<=页面上最多显示11/2个页码
      if self.current_page_num <= self.pager_count_half:
        pager_start = 1
        pager_end = self.pager_count + 1
      # 当前页大于5
      else:
        # 页码翻到最后
        if (self.current_page_num + self.pager_count_half) > self.all_pager:

          pager_start = self.all_pager - self.pager_count + 1
          pager_end = self.all_pager + 1

        else:
          pager_start = self.current_page_num - self.pager_count_half
          pager_end = self.current_page_num + self.pager_count_half + 1

    page_html_list = []

    first_page = '<li><a href="?page=%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页</a></li>' % (1,)
    page_html_list.append(first_page)

    if self.current_page_num <= 1:
      prev_page = '<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" >上一页</a></li>'
    else:
      prev_page = '<li><a href="?page=%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>' % (self.current_page_num - 1,)

    page_html_list.append(prev_page)

    # self.params=copy.deepcopy(request.GET) # {"a":"1","b":"2"}

    for i in range(pager_start, pager_end):

      self.params["page"] = i

      if i == self.current_page_num:
        temp = '<li class="active"><a href="?%s" rel="external nofollow" rel="external nofollow" >%s</a></li>' % (self.params.urlencode(), i)
      else:
        temp = '<li><a href="?%s" rel="external nofollow" rel="external nofollow" >%s</a></li>' % (self.params.urlencode(), i,)
      page_html_list.append(temp)

    if self.current_page_num >= self.all_pager:
      next_page = '<li class="disabled"><a href="#" rel="external nofollow" rel="external nofollow" >下一页</a></li>'
    else:
      next_page = '<li><a href="?page=%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>' % (self.current_page_num + 1,)
    page_html_list.append(next_page)
    last_page = '<li><a href="?page=%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>' % (self.all_pager,)
    page_html_list.append(last_page)

    return ''.join(page_html_list)

在视图中使用

views.py

# 首先导入包
from myapp.utils.page import Pagination
from myapp.models import User


def index(request):
  # queryset
  user_list = User.objects.all()
  # 总页数
  page_count = user_list.count()
  # 当前页
  current_page_num = request.GET.get("page")
  pagination = Pagination(current_page_num, page_count, request, per_page_num=1)
  # 处理之后的数据
  user_list = user_list[pagination.start:pagination.end]

  content = {
    "user_list": user_list,
    "pagination": pagination,
  }
  return render(request, "user_list.html", content)

页面显示

user_list.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="external nofollow" >
</head>
<body>
<div class="container">
  <table class="table table-striped">
    <thead>
    <tr>
      <th>name</th>
    </tr>
    </thead>
    <tbody>
    {% for user in user_list %}
      <tr>
        <td>{{ user.name }}</td>
      </tr>
    {% endfor %}
    </tbody>
  </table>
  <!-- bootstrap 样式 -->
  <div class="dataTables_paginate paging_simple_numbers pull-right">
    <ul class="pagination">
      {{ pagination.page_html|safe }}
    </ul>
  </div>
</div>
</body>
</html>

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

Python 相关文章推荐
python脚本实现xls(xlsx)转成csv
Apr 10 Python
python SMTP实现发送带附件电子邮件
May 22 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
Python数据类型之List列表实例详解
May 08 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
python Plotly绘图工具的简单使用
Mar 03 Python
python3读取autocad图形文件.py实例
Jun 05 Python
python中线程和进程有何区别
Jun 17 Python
python如何查看安装了的模块
Jun 23 Python
深入了解Python enumerate和zip
Jul 16 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
基于python的列表list和集合set操作
Nov 24 #Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 #Python
Python完全识别验证码自动登录实例详解
Nov 24 #Python
关于Python 常用获取元素 Driver 总结
Nov 24 #Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 #Python
使用Python实现画一个中国地图
Nov 23 #Python
用Python画小女孩放风筝的示例
Nov 23 #Python
You might like
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
学习Node.js模块机制
2016/10/17 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
python检测lvs real server状态
2014/01/22 Python
python命令行参数sys.argv使用示例
2014/01/28 Python
Python 异常处理实例详解
2014/03/12 Python
Python解决八皇后问题示例
2018/04/22 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
python logging通过json文件配置的步骤
2020/04/27 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
《理想的风筝》教学反思
2014/04/11 职场文书
奶茶店创业计划书
2014/08/14 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
医生见习报告范文
2014/11/03 职场文书
教导主任个人总结
2015/03/03 职场文书
调任通知
2015/04/21 职场文书
MySQL数据库完全卸载的方法
2022/03/03 MySQL
python字符串的一些常见实用操作
2022/04/06 Python