Python 自定义分页方法及示例

news/2024/11/25 23:17:17/

Python 自定义分页方法及示例

后端写法:


# 适用于UI的分页前端
# 适用于所有数据分页,普通分页
class Pagination(object):# totalCnt代表表单内容总数量def __init__(self, currentPage, perPageCnt, totalCnt, pageIndexCnt, urls):self.currentPage = currentPageself.perPageCnt = perPageCntself.totalCnt = totalCntself.pageIndexCnt = pageIndexCnt  # 表示分页索引显示几个页面,一般显示5个self.urls = urls# 加上@property时,调用方法不用加()@propertydef page_nums(self):if self.totalCnt % self.perPageCnt == 0:return int(self.totalCnt / self.perPageCnt)else:return int(self.totalCnt / self.perPageCnt) + 1# 其实条数,切片用@propertydef startNum(self):return (self.currentPage - 1) * self.perPageCnt@propertydef endNum(self):return self.currentPage * self.perPageCnt@propertydef prevPage(self):return self.currentPage - 1@propertydef nextPage(self):return self.currentPage + 1# 分页显示页码,比如显示: prev<< 4,5,6,7,8 >>next@propertydef pageRange(self):part = int(self.pageIndexCnt / 2)if self.pageIndexCnt < self.page_nums:if self.currentPage < int(self.pageIndexCnt / 2 + 1):return range(1, self.pageIndexCnt + 1)elif self.currentPage > self.page_nums - part:return range(self.page_nums - self.pageIndexCnt, self.page_nums + 1)else:return range(self.currentPage - part, self.currentPage + part + 1)else:return range(1, self.page_nums + 1)# 直接输送代码给模板@propertydef pageStr(self):pageNumStr = []prev_page = ""next_page = ""# 页码if self.currentPage > 1 and self.currentPage < self.page_nums:prev_page = "<li><a href=" + self.urls + "?p=%s>&laquo; Prev</a></li>" % (self.currentPage - 1)next_page = "<li><a href=" + self.urls + "?p=%s>Next &raquo;</a></li>" % (self.currentPage + 1)if self.currentPage <= 1:prev_page = "<li class='am-disabled'><a href='#'>&laquo; Prev</a></li>"if self.currentPage >= self.page_nums:next_page = "<li class='am-disabled'><a href='#'>Next &raquo;</a></li>"for page in self.pageRange:if page == self.currentPage:pageNumStr.append("<li class='am-active'><a href=" + self.urls + "?p=%s>%s</a></li>" % (page, page))else:pageNumStr.append("<li><a href=" + self.urls + "?p=%s>%s</a></li>" % (page, page))# print(pageNumStr)return prev_page + "".join(pageNumStr) + next_page# 适用于UI的分页前端
# 对已经分页的数据进行查询,对查询后的数据再次进行分页
# 思路:url请求除了需要带current page 还需要带查询的内容
class PaginationQuery(object):# content代表需要查询的关键字def __init__(self, currentPage, perPageCnt, totalCnt, pageIndexCnt, urls, content):self.currentPage = currentPage  # 当前页码self.perPageCnt = perPageCnt  # 每页要显示多少条self.totalCnt = totalCnt  # totalCnt代表表单内容总数量self.pageIndexCnt = pageIndexCnt  # 表示分页索引显示几个页面,一般显示5个self.urls = urls  # 请求路径self.content = content  # 查询关键字# 加上@property时,调用方法不用加()@propertydef page_nums(self):if self.totalCnt % self.perPageCnt == 0:return int(self.totalCnt / self.perPageCnt)else:return int(self.totalCnt / self.perPageCnt) + 1# 其实条数,切片用@propertydef startNum(self):return (self.currentPage - 1) * self.perPageCnt@propertydef endNum(self):return self.currentPage * self.perPageCnt@propertydef prevPage(self):return self.currentPage - 1@propertydef nextPage(self):return self.currentPage + 1# 分页显示页码,比如显示: prev<< 4,5,6,7,8 >>next@propertydef pageRange(self):part = int(self.pageIndexCnt / 2)if self.pageIndexCnt < self.page_nums:if self.currentPage < int(self.pageIndexCnt / 2 + 1):return range(1, self.pageIndexCnt + 1)elif self.currentPage > self.page_nums - part:return range(self.page_nums - self.pageIndexCnt, self.page_nums + 1)else:return range(self.currentPage - part, self.currentPage + part + 1)else:return range(1, self.page_nums + 1)# 直接输送代码给模板@propertydef pageStr(self):pageNumStr = []prev_page = ""next_page = ""# 页码if self.currentPage > 1 and self.currentPage < self.page_nums:prev_page = "<li><a href=" + self.urls + "?p=%s&content=%s>&laquo; Prev</a></li>" % (self.currentPage - 1, self.content)next_page = "<li><a href=" + self.urls + "?p=%s&content=%s>Next &raquo;</a></li>" % (self.currentPage + 1, self.content)if self.currentPage <= 1:prev_page = "<li class='am-disabled'><a href='#'>&laquo; Prev</a></li>"if self.currentPage >= self.page_nums:next_page = "<li class='am-disabled'><a href='#'>Next &raquo;</a></li>"for page in self.pageRange:if page == self.currentPage:pageNumStr.append("<li class='am-active'><a href=" + self.urls + "?p=%s&content=%s>%s</a></li>" % (page, self.content, page))else:pageNumStr.append("<li><a href=" + self.urls + "?p=%s&content=%s>%s</a></li>" % (page, self.content, page))# print(pageNumStr)return prev_page + "".join(pageNumStr) + next_page# 分页在方法中的应用
def index(request):content = request.GET.get("content", '').strip()# 判断是否有查询内容if content:vuls = Vul.objects.filter(Q(acquired=1),(Q(title__icontains=content) |Q(vul_brief_intro__icontains=content) |Q(vul_anno__icontains=content)|Q(danger_level__contains=content)|Q(threat_type__contains=content))).order_by("-release_time")else:vuls = Vul.objects.filter(acquired=1,danger_level__in=('中危','高危','超危')).order_by("-release_time")# 分页显示# 分页显示currentPage = int(request.GET.get("p", 1))  # 当前页,如果没有默认1perPageCnt = int(request.GET.get("perPageCnt", 25))  # 每页显示数据数量,默认10totalCnt = vuls.count()  # 获取全部数据个数pageIndexCnt = 5  # 显示页码 5个,# 判断是否有查询,如果没有就取全部index即可(调用PaginationQuery),如果有内容就调用PaginationQueryif content:pagination = PaginationQuery(currentPage, perPageCnt, totalCnt, pageIndexCnt, request.path, content)else:pagination = Pagination(currentPage, perPageCnt, totalCnt, pageIndexCnt, request.path)# pagination = Pagination(currentPage, perPageCnt, totalCnt, pageIndexCnt, request.path)# 获取当前页面要显示的内容,使用切片模式if currentPage > 0 and currentPage < pagination.page_nums:vuls = vuls[pagination.startNum:pagination.endNum]elif currentPage == pagination.page_nums:vuls = vuls[pagination.startNum::]else:vuls = vuls[0:10]ctx = {'vuls': vuls,"pagination": pagination,'content':content}return render(request, "index.html", ctx)

前端写法:

 <div style="display: inline;margin-bottom: 15%"><ul class="am-pagination am-pagination-centered"><li>共{{ pagination.totalCnt }}条数据&nbsp</li><li><a href="{{ pagination.urls }}?p=1&&content={{ content }}">首页</a></li>{{ pagination.pageStr|safe }}<li><a href="{{ pagination.urls }}?p={{ pagination.page_nums }}&&content={{ content }}">尾页</a></li><li>总页数: {{ pagination.page_nums }}</li><li>&nbsp;<input type="text" name="pageNum" id="pageNum" style="width: 60px"><button type="button" class="am-btn am-btn-default  am-btn-sm" onclick="fun()">跳转页</button></li></ul></div>
<script>function fun() {var pageNum = document.getElementById('pageNum').value;window.location.href = '{{ pagination.urls }}?p=' + pageNum;}</script>

前端效果:
在这里插入图片描述


http://www.ppmy.cn/news/112492.html

相关文章

智能音箱音效哪个好_四大智能音箱,你觉得哪个才是最好用的?

随着科技和生活水平不断的提高&#xff0c;很多人对于生活的享受方面都有所重视&#xff0c;因此在忙碌之后&#xff0c;好些人会选择一些方式来放松自己&#xff0c;那么音乐便是其中之一了&#xff0c;而喜欢音乐那么必不可少的东西就是音箱了&#xff0c;而今天小编刚好想跟…

5款主流智能音箱入门款测评:苹果小米华为天猫小度,谁的表现更胜一筹?

智能音箱那么多&#xff0c;究竟谁更好&#xff1f;要说智能行不行&#xff0c;就让它们各自吵。纵观各个智能家居生态&#xff0c;智能音箱几乎都是作为智能家居交互入口的必备产品之一。除了可以播放音乐&#xff0c;这个音箱本体的功能以外&#xff0c;内置网关是智能家居中…

智能音箱音效哪个好_语音智能音响哪个好 智能语音音箱推荐【详解】

之前朋友买了一款智能音箱&#xff0c;只听他对音箱下了一个口头命令&#xff0c;音箱马上就执行了这个命令&#xff0c;开始播放音乐了&#xff0c;感觉非常神奇&#xff0c;于是小编便对这些智能音箱产生兴趣了&#xff0c;决定为大家推荐几款值得大家去选购的智能音箱。 无需…

索爱E30超重低音炮蓝牙音箱怎么样啊?

时间如流水般匆匆而逝&#xff0c;转眼间&#xff0c;2020已进入尾声。临近跨年&#xff0c;很多小伙伴都会给自己&#xff0c;或者另一半&#xff0c;又或者朋友&#xff0c;挑选一份新年礼物。那么&#xff0c;送什么礼物好呢&#xff1f;对于犹豫不决、没有方向的小伙伴来说…

高端蓝牙耳机哪个牌子好?四款高音质不错的蓝牙耳机推荐

在这个快速发展的时代&#xff0c;越来越多人喜欢戴着耳机听音乐沉浸在自己的世界里&#xff0c;所以越来越多人对蓝牙耳机的音质非常看重&#xff0c;但也还有很多小伙伴不知道怎么选耳机的&#xff0c;接下来&#xff0c;我来给大家推荐四款高音质不错的蓝牙耳机&#xff0c;…

智能音箱的五大核心技术

在很多人眼里依旧是新潮玩意的智能音箱&#xff0c;往往具备智能家居声控中心和个人助理两大核心功能。通过智能音箱可以实现对家居中的智能电器进行联网和语音控制&#xff0c;同样也可完成日常安排、订餐厅、叫车、阅读、翻译、通话等类似个人助理的功能。智能音箱的优势在于…

多媒体音箱选购指南--理论篇

作者&#xff1a;朱泽晨 小熊西安 在多媒体应用丰富的今天&#xff0c;一套多媒体音箱基本上是每一套系统中的标准配置。而大多数用户往往会忽视这方面的选择&#xff0c;为什么会存在这种现象呢&#xff1f;消费者一般存在两个极端的心态:1,本身对音频系统表现就没有过高要求,…

接口500什么原因_性价比最高的电脑音箱有哪些?20款50-500元电脑音箱推荐

台式电脑想要输出声音&#xff0c;就需要搭配一款音箱或者耳机&#xff0c;不过有些用户因为种种原因不喜欢戴耳机&#xff0c;还是倾向音箱一些&#xff0c;所以本文准备推荐一些值得选购的电脑音箱&#xff0c;不过对于音箱价位基本没有上限的&#xff0c;没有最好只有更好&a…