Django分页类的封装

Django ORM 

封装

之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率。

其实不是很难,就是将之前实现的代码全都放到类中,将需要用到的参数,比如,page_num, total_count, url_prefix, per_page, max_page,以参数的形式传到类中进行初始化,而后的实现代码即可用 self.变量名 的形式使用自己分页类内部的变量。

Page 类

class myPage():
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
self.per_page = per_page total_page, m = divmod(total_count, per_page)
if m > 0:
total_page += 1 self.total_page = total_page try:
page_num = int(page_num)
# 如果输入页码数过大,默认跳到最后一页
if page_num > total_page:
page_num = total_page
except Exception as e:
page_num = 1 self.page_num = page_num self.data_start = (page_num - 1) * 10
self.data_end = page_num * 10 # 1. 先实现一半一半
max_page = 11
# 10. 如果数据量少,页数也少
if total_page < max_page:
self.max_page = total_page
half_max_page = max_page // 2
page_start = page_num - half_max_page
page_end = page_num + half_max_page # 2. 特殊情况一:页码前面出现负值
if page_start < 1:
page_start = 1
page_end = self.max_page # 3. 特殊情况二:页码后面出现空白页
if page_end >= total_page:
page_start = total_page - self.max_page + 1
page_end = total_page 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):
page_html_list = [] # 9. 解决在首页处点前一页
if self.page_num == 1:
page_html_list.append(
'<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>')
else:
page_html_list.append(
'<li><a href="{0}?pages={1}"><span aria-hidden="true">&laquo;</span></a></li>'.format(self.url_prefix,
self.page_num - 1)) # 4. 加上首页
page_html_list.append('<li><a href="{}?pages=1">首页</a></li>'.format(self.url_prefix)) for i in range(self.page_start, self.page_end + 1):
# 11. 对当前页加上活动active样式类
if i == self.page_num:
temp = '<li class="active"><a href="{0}?pages={1}">{1}</a></li>'.format(self.url_prefix, i)
else:
temp = '<li><a href="{0}?pages={1}">{1}</a></li>'.format(self.url_prefix, i)
page_html_list.append(temp) # 5. 加上尾页
page_html_list.append('<li><a href="{0}?pages={1}">尾页</a></li>'.format(self.url_prefix, self.total_page)) # 8. 解决最后一页时点后一页
if self.page_num == self.total_page:
page_html_list.append(
'<li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>')
else:
page_html_list.append(
'<li><a href="{0}?pages={1}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>'.format(
self.url_prefix,
self.page_num + 1)) # 转成字符串
page_html = "".join(page_html_list)
return page_html

前端模板代码

前端模板代码没有什么改变

<div class="container">
<table class="table table-bordered">
<thead>
<tr>
<th>序号</th>
<th>id</th>
<th>部门名称</th>
</tr>
</thead>
<tbody>
{% for dept in depts %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ dept.id }}</td>
<td>{{ dept.name }}</td>
</tr>
{% endfor %} </tbody>
</table> <nav aria-label="Page navigation">
<ul class="pagination"> {{ page_html|safe }} </ul>
</nav>
</div>

views 中的代码

只需要实例化分页类就能实现分页操作,与之前的方法相比,代码量减少了不少。

def depts(request):
# 从相应模块中导入分页类
from utils.myPage import myPage all_depts = models.Dept2.objects.all()
page_num = request.GET.get("pages")
total_num = models.Dept2.objects.all().count() # 实例化分页类
page_obj = myPage(page_num, total_num, '/depts/', per_page=10, max_page=11)
# 通过实例的变量从数据库中取出需要展示的数据
ret = models.Dept2.objects.all()[page_obj.start:page_obj.end]
# 由实例调用函数生成需要的HTML代码
dept_page_html = page_obj.page_html()
return render(request, "depts.html", {"depts": ret, "page_html": dept_page_html})

效果图

GitHub地址:https://github.com/protea-ban/oldboy/tree/master/s9day71/ormday71

Django分页类的封装的更多相关文章

  1. 自定义MVC框架之工具类-分页类的封装

    以前写过一个MVC框架,封装的有点low,经过一段时间的沉淀,打算重新改造下,之前这篇文章封装过一个验证码类. 这次重新改造MVC有几个很大的收获 >全部代码都是用Ubuntu+Vim编写,以前 ...

  2. php 之 分页查询的使用方法及其类的封装

    一.分页的使用: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  3. Django 自定义分页类

    分页类代码: class Page(object): ''' 自定义分页类 可以实现Django ORM数据的的分页展示 输出HTML代码: 使用说明: from utils import mypag ...

  4. Django 实现的分页类

    后台实现的一个分页类: from django.utils.safestring import mark_safe class Page: def __init__(self, current_pag ...

  5. php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;

    Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...

  6. django 分页(2) 使用类 页码显示

    django 分页显示页码 views.py 显示11页码 ) < 起始位置 - 10总页数 else 总页数 > IF 当前页 小于 起始位置 结束页 IF 当前页 大于 IF 如果结束 ...

  7. 封装好的PHP分页类,简单好用--在开源看到的,取回来自己用

    class Pagination  独立分页类 调用方式: $pagenation = new Pagination( 4, 10, 200 ); // 4(第一个参数) = currentPage, ...

  8. django 分页组件

      一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib i ...

  9. Django分页的实现

    Django分页的实现 Django ORM  分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...

随机推荐

  1. Zookeeper 源码(五)Leader 选举

    Zookeeper 源码(五)Leader 选举 前面学习了 Zookeeper 服务端的相关细节,其中对于集群启动而言,很重要的一部分就是 Leader 选举,接着就开始深入学习 Leader 选举 ...

  2. RocketMQ 自定义文件路径

    一 .1. 修改store路径2. 修改logs路径3. 修改rmq_bk_gc.log路径4. 修改rmq_srv_gc.log路径二 .1. 获取正确的rocketmq 源码2. 地址:https ...

  3. Quartus II 软件生成FFT、NCO、FIR等IP核时卡住不动的解决办法

    据网友表示,遇到这个问题时,在任务管理器中手动关闭quartus_map进程就可以了,由于我的电脑最近一直没有出问题,因此也无法验证.欢迎大家针对这个问题讨论,提出肯定.否定的说法. 另外,很多人表示 ...

  4. Sqlite 快速插入数据到本地表中

    用原始Insert方法太慢,网上找到了https://www.cnblogs.com/yisen-code/p/6897524.html 思路是: 开启事务,开启预处理,然后把SQL用参数传入具体值来 ...

  5. TestNG(一)——起步

    你可以从 http://testng.org/doc/documentation-main.html 获取信息. 一.简介 TestNG是test next generation的缩写,即下一代测试技 ...

  6. CentOS6.4 X86_64 kvm+PXE备忘

    Install 安装 1 2 3 4 5 # yum install qemu-kvm qemu-img # 使用kvm至少要安装的包,一个提供用户级别kvm模拟器,一个提供磁盘镜像的管理 # 安装虚 ...

  7. TFS (Team Foundation Server) 2013集成Maven构建

    Team Foundation Server原生就支持跨平台的构建,包括Ant和Maven两种构建方式.通过配置构建服务器,连接TFS源代码库,可以实现持续集成构建,自动检测代码库健康状况,进而实现自 ...

  8. 在TFS 2013中选择一周中的工作日,例如增加星期日

    默认情况下,TFS在迭代视图中不计算周末的工作,如果出现调休的情况,则周末的工作日不会出现在迭代视图中,也不会参与燃尽图的计算.但是可以调整团队一周中的工作日,从而修正迭代计算方式,修改的方式参考下图 ...

  9. CodeIgniter使用中写的一些文章

    CI的captcha替代类库:  http://www.ifixedbug.com/posts/codeigniter-captcha-library 原生的captcha不是太好用,自己组装一个吧. ...

  10. 使用 IIS 在 Windows 上托管 ASP.NET Core(Windows安装实践)

    原文地址 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.0&tabs= ...