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中的字典容器
Apr 14 Python
python用pickle模块实现“增删改查”的简易功能
Jun 07 Python
python 字典修改键(key)的几种方法
Aug 10 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
python英语单词测试小程序代码实例
Sep 09 Python
Python post请求实现代码实例
Feb 28 Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 Python
详解Python IO编程
Jul 24 Python
python中pyplot基础图标函数整理
Nov 10 Python
python模板入门教程之flask Jinja
Apr 11 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 彩色文字实现代码
2009/06/29 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
2016/10/10 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
vue + element-ui的分页问题实现
2018/12/17 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
python实现朴素贝叶斯算法
2018/11/19 Python
python实现感知器算法(批处理)
2019/01/18 Python
python单例模式的多种实现方法
2019/07/26 Python
python实现图片压缩代码实例
2019/08/12 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
Servlet的生命周期
2013/08/25 面试题
酒店保安员岗位职责
2014/01/31 职场文书
爱心活动计划书
2014/04/26 职场文书
公司总经理任命书
2014/06/05 职场文书
幼儿园端午节活动方案
2014/08/25 职场文书
敬老月活动总结
2014/08/28 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
党性分析自查总结
2014/10/14 职场文书
党员争先创优承诺书
2015/01/20 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL