自定义分页器

好久没来写东西那!今天写个自定义分页器给大家参考下吧

首先我们在自己创建的Django项目的app下新建一个utils文件夹,用来放我们的分页器组件

 

简单说下分页器实现原理:

  1.利用ORM查询语句的限制数据条数来确定每页显示的数据

  2.设置我们每页显示的数据条数以及每页显示的页码数(例如本次默认页码数是11)

  3.判断要显示的数据条数的页码数是否大于我们设置的页码总数

  4.如果大于,则判断是否是页码总数的前段还是后段,是否要翻页处理;比如我们设置的页码总数是11个,那么就是用当前页-1/2得到半数,最后根据半数的值判断是否翻页

  5.先利用函数的方式实现,随后利用class来完成封装

 

我们在utils文件下创建有个pager.py的文件

"""
自定义分页组件的使用方法:pager_obj = Pagination(request.GET.get('page',1),len(HOST_LIST),request.path_info,request.GET)host_list = HOST_LIST[pager_obj.start:pager_obj.end]html = pager_obj.page_html()return render(request,'hosts.html',{'host_list':host_list,"page_html":html})
"""class Pagination(object):"""自定义分页"""def __init__(self,current_page,total_count,base_url,params,per_page_count=10,max_pager_count=11):try:current_page = int(current_page)except Exception as e:current_page = 1if current_page <=0:current_page = 1self.current_page = current_page# 数据总条数self.total_count = total_count# 每页显示10条数据self.per_page_count = per_page_count# 页面上应该显示的最大页码max_page_num, div = divmod(total_count, per_page_count)if div:max_page_num += 1self.max_page_num = max_page_num# 页面上默认显示11个页面(当前页在中间)self.max_pager_count = max_pager_countself.half_max_pager_count = int((max_pager_count - 1) / 2)# URL前缀self.base_url = base_url# request.GETimport copyparams = copy.deepcopy(params)# 设置request能修改取到的值params._mutable = True# 包含当前列表页面所有的搜索条件# {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}# self.params[page] = 8# self.params.urlencode()# source=2&status=2&gender=2&consultant=1&page=8# href="/hosts/?source=2&status=2&gender=2&consultant=1&page=8"# href="%s?%s" %(self.base_url,self.params.urlencode())self.params = params@propertydef start(self):return (self.current_page - 1) * self.per_page_count@propertydef end(self):return self.current_page * self.per_page_countdef page_html(self):# 如果总页数 <= 11if self.max_page_num <= self.max_pager_count:pager_start = 1pager_end = self.max_page_num# 如果总页数 > 11else:# 如果当前页 <= 5if self.current_page <= self.half_max_pager_count:pager_start = 1pager_end = self.max_pager_countelse:# 当前页 + 5 > 总页码if (self.current_page + self.half_max_pager_count) > self.max_page_num:pager_end = self.max_page_numpager_start = self.max_page_num - self.max_pager_count + 1else:pager_start = self.current_page - self.half_max_pager_countpager_end = self.current_page + self.half_max_pager_countpage_html_list = []# {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}self.params['page'] = 1first_page = '<a href="%s?%s">首页</a>' % (self.base_url,self.params.urlencode(),)page_html_list.append(first_page)# 上一页if self.current_page == 0:page_up = '<a href="%s?%s">上一页</a>' % (self.base_url,self.params.urlencode())else:self.params['page'] = self.current_page - 1page_up = '<a class="active" href="%s?%s">上一页</a>' % (self.base_url,self.params.urlencode())page_html_list.append(page_up)for i in range(pager_start, pager_end + 1):self.params['page'] = iif i == self.current_page:temp = '<a class="active" href="%s?%s">%s</a>' % (self.base_url,self.params.urlencode(), i,)else:temp = '<a href="%s?%s">%s</a>' % (self.base_url,self.params.urlencode(), i,)page_html_list.append(temp)# 下一页if self.current_page == self.max_page_num:page_down = '<a href="%s?%s">下一页</a>' % (self.base_url,self.params.urlencode())else:self.params['page'] = self.current_page + 1page_down = '<a class="active" href="%s?%s">下一页</a>' % (self.base_url,self.params.urlencode())page_html_list.append(page_down)self.params['page'] = self.max_page_numlast_page = '<a href="%s?%s">尾页</a>' % (self.base_url, self.params.urlencode(),)page_html_list.append(last_page)return ''.join(page_html_list)
View Code

 

然后我们在view.py视图中调用

def hosts(request):from .utils.pager import PaginationHOST_LIST = []for i in range(1, 213):HOST_LIST.append("c%s.com" % i)pager_obj = Pagination(request.GET.get('page',1),len(HOST_LIST),request.path_info,request.GET)HOST_LIST = HOST_LIST[pager_obj.start:pager_obj.end]page_html = pager_obj.page_html()return render(request,'hosts.html',locals())
View Code

 

这样就完成那!

 

转载于:https://www.cnblogs.com/encp/p/9600828.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五 Vue学习 首页学习 (上)

首页&#xff1a; http://localhost:8002/#/&#xff0c; 登录页面如下&#xff1a; index.js文件中如下的路由配置&#xff0c;转过去看login.vue是如何实现的。 const routes [ { path: /, component: login },&#xff08;这里一个问题&#xff1a; logi…

linux下mqm添加用户,Linux 下MQ的安装和配置亲测

开篇之前奉上几条黄金链接&#xff1a;MQ参考文档http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic%2Fcom.ibm.mq.doc%2Fhelp_home_wmq.htmhttp://www-01.ibm.com/support/docview.wss?uidswg27006467MQ下载地址&#xff1a;http://www-03.ibm.com/so…

小程序tabbar这套方案全搞定!

关于微信小程序的tarbar&#xff0c;相信你们都不会陌生 在实现小程序微信原装的tabbar却比较呆板&#xff0c;不够精致&#xff0c;往往不符合自己的要求 这个时候怎么办呢 这套方案接着&#xff01; 先简单的来说一下主要思想:自定义字体图标组件以及tabbar组件&#xff0c…

linux服务器用哪个面板好,Linux服务器管理面板哪家比较好用?

Linux服务器管理面板哪家比较好用&#xff1f;发布时间&#xff1a;2020-07-21 06:08:33来源&#xff1a;51CTO阅读&#xff1a;261作者&#xff1a;BirdCloud_1022现在&#xff0c;越来越多的站长朋友都会选择服务器用来搭建网站&#xff0c;但是势必需要我们自己搭建WEB环境&…

spring boot(一)入门

目录 spring boot(一)入门一、简介1、微服务的概念2、什么是spring boot3、快速入门4.springboot的快捷部署spring boot(一)入门 一、简介 1、微服务的概念 说起spring boot&#xff0c;我们不得不说一下“微服务”一词的兴起&#xff0c;微服务一词最早起源于2014年&#xff0…

Linux usb bus日志如何打开,从linux usb bus节点来认识usb linux usb认识

首先从linux dmesg来认识usb:<6>[ 19.610046] msm_hsic_host msm_hsic_host: Qualcomm EHCI Host Controller using HSIC<6>[ 19.620391] msm_hsic_host msm_hsic_host: new USB bus registered, assigned bus number 1<6>[ 19.659942] msm_hsic_host …

Spring面试问题

还可以查看我们最新的文章69Spring面试问答-最终名单 。 1&#xff09;什么是春天&#xff1f; 回答&#xff1a; Spring是控件和面向方面的容器框架的轻量级转换。 2&#xff09;解释春天&#xff1f; 回答&#xff1a; 轻巧&#xff1a;在尺寸和透明度方面&#xff0c; S…

201771010120 苏浪浪 《面向对象程序设计(java)》第二周学习总结

理论知识总结 第三章Java基本程序设计结构 1、基本知识&#xff1a;&#xff08;1&#xff09;标识符&#xff1a;是由字母、下划线、美元符号和数字组成&#xff0c;且第一个符号不能为数字。&#xff08;2&#xff09;关键字&#xff1a;剧啊语言中被赋予特定意义的一些单词。…

Apache Camel简介

Apache Camel是著名的企业集成模式的开源实现。 Camel是一个路由和中介引擎&#xff0c;可以帮助开发人员以各种领域特定语言&#xff08;DSL&#xff09;&#xff08;例如Java&#xff0c;Spring / XML&#xff0c;scala等&#xff09;创建路由和中介规则。 骆驼用途广泛 Cam…

qt结构体嵌套结构体方法_9.2 C++结构体类型变量

C定义结构体类型变量的方法 1、先声明结构体类型再定义变量名&#xff0c;在定义了结构体变量后&#xff0c;系统会为之分配内存单元。struct Student{ //自定义结构体变量int num;//学号char sex;//性别int age;//年龄};2、在声明类型的同时定义变量 一般形式为struct 结构体名…

Vue解析--如何应对面试官提问

近期不断面试中&#xff0c;面试官都会提一些关于Vue相关的源码和“全家桶”之类的问题。那么针对这些提问&#xff0c;我们应该如何更好应答呢&#xff1f;在这里我把对Vue的理解整理出来供大家来参考。 1.Vue是什么&#xff1f; Vue是一套构建用户界面的渐进式框架&#xf…

Java开发人员的Erlang

您可能没有注意到&#xff0c;但是距离我上次发布博客已经过去了几个星期。 原因是我的Soleus骨折了&#xff0c;而我的腿也石膏了。 不能动弹&#xff0c;我认为调查完全不同的东西是个好主意–要么看那天的电视&#xff0c;要么&#xff0c;尽管Kojak和Magnum PI的重播很诱人…

20165339第六周学习总结

课本知识点总结 第八章 String类 使用String类声明对象并创建对象 String s new String("We are students"); String t new String("We are students"); String (char a[])用一个字符数组a创建一个String对象 char a[] {J,a,v,a}; String s new String(a)…

keil5用jlink不到芯片_洛达芯片检测

安卓手机下载一个络达官方的刷机软件然后连接上耳机&#xff0c;打开软件&#xff0c;就可以看到耳机芯片的相关信息。软件下载地址&#xff1a;https://pan.baidu.com/s/1MOXjkHv1wfxWWIVdcsMSFg 提取码: tasc我们的耳机都是络达芯片&#xff0c;不怕你检测&#xff0c;希望用…

层次和约束:项目中使用vuex的3条优化方案

问题描述 使用vuex的store的过程中&#xff0c;发现了一些不是很优雅的地方&#xff1a; store层module太多&#xff0c;找state、getter、mutation、action对应的module比较慢。 组件里面mapGetters、mapActions、mapMutations过多&#xff0c;分不清getter、action、mutati…

怎么让员工服从管理_为什么现在的员工执行力和服从性越来越差,管理一严格就辞职?...

当有负面情绪的时候&#xff0c;不要说。管好自己的嘴&#xff0c;有时候做哑巴&#xff0c;是一种境界。现在的企业很多都存在这个问题&#xff0c;员工执行力越来越差&#xff0c;服从性也越来越差&#xff0c;管理者稍微一严格&#xff0c;员工就会辞职走人&#xff0c;留不…

Spring Data REST的实际应用

什么是春天数据休息&#xff1f; spring-data-rest是spring-data项目的新增功能&#xff0c;它是一个框架&#xff0c;可帮助您将实体直接作为RESTful Web服务端点公开。 与rails&#xff0c;grails或roo不同&#xff0c;它不会生成任何实现此目标的代码。 spring data-rest支持…

2018上半年掘金微信群日报优质文章合集:前端篇

在掘金微信交流群里的小伙伴们&#xff0c;你们每天都还在坚持读小报吗&#xff1f;如果你的回答是yes&#xff0c;那真的要给你点一万个赞了?能坚持这么久&#xff0c;真的很优秀噢&#xff01;&#xff08;嗯&#xff0c;每天坚持给大家收集文章的小饼也很优秀?&#xff09…

linux运维笔试题目,linux运维相关的笔试题目_笔试题目

一、Linux系统和shell1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容&#xff0c;要求&#xff1a;①删除所有空行&#xff1b;②在非空行前面加一个“AAA”&#xff0c;在行尾加一个“BBB”&#xff0c;即将内容为“11111”的一行改为&#xff1a;“AAA11111BBB”…

python之路--day17-shelve,xml和re模块

shelve模块 shelve模块只有一个open函数&#xff0c;返回类似字典的对象&#xff0c;可读可写&#xff0c;key必须为字符串&#xff0c;而值可以是python所支持的数据类型 1 import shelve2 # info1{age:18,height:180,weight:80}3 # info2{age:73,height:150,weight:80}4 #5 #…