【django学习-23】分页功能

news/2024/9/21 22:37:26
  • 前言:当列表界面数据量大的时候,我们一般就要用到分页功能。
  • 下面是已经封装好的组件,使用方法
    • 1.分页组件
"""
自定义的分页组件,以后如果想要使用这个分页组件,你需要做如下几件事:在视图函数中:def pretty_list(request):# 1.根据自己的情况去筛选自己的数据queryset = models.PrettyNum.objects.all()# 2.实例化分页对象page_object = Pagination(request, queryset)context = {"queryset": page_object.page_queryset,  # 分完页的数据"page_string": page_object.html()       # 生成页码}return render(request, 'pretty_list.html', context)在HTML页面中{% for obj in queryset %}{{obj.xx}}{% endfor %}<ul class="pagination">{{ page_string }}</ul>"""from django.utils.safestring import mark_safeclass Pagination(object):def __init__(self, request, queryset, page_size=10, page_param="page", plus=5):""":param request: 请求的对象:param queryset: 符合条件的数据(根据这个数据给他进行分页处理):param page_size: 每页显示多少条数据:param page_param: 在URL中传递的获取分页的参数,例如:/pretty/list/?page=12:param plus: 显示当前页的 前或后几页(页码)"""from django.http.request import QueryDictimport copyquery_dict = copy.deepcopy(request.GET)query_dict._mutable = Trueself.query_dict = query_dictself.page_param = page_parampage = request.GET.get(page_param, "1")if page.isdecimal():page = int(page)else:page = 1self.page = pageself.page_size = page_sizeself.start = (page - 1) * page_sizeself.end = page * page_sizeself.page_queryset = queryset[self.start:self.end]total_count = queryset.count()total_page_count, div = divmod(total_count, page_size)if div:total_page_count += 1self.total_page_count = total_page_countself.plus = plusdef html(self):# 计算出,显示当前页的前5页、后5页if self.total_page_count <= 2 * self.plus + 1:# 数据库中的数据比较少,都没有达到11页。start_page = 1end_page = self.total_page_countelse:# 数据库中的数据比较多 > 11页。# 当前页<5时(小极值)if self.page <= self.plus:start_page = 1end_page = 2 * self.plus + 1else:# 当前页 > 5# 当前页+5 > 总页面if (self.page + self.plus) > self.total_page_count:start_page = self.total_page_count - 2 * self.plusend_page = self.total_page_countelse:start_page = self.page - self.plusend_page = self.page + self.plus# 页码page_str_list = []self.query_dict.setlist(self.page_param, [1])page_str_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))# 上一页if self.page > 1:self.query_dict.setlist(self.page_param, [self.page - 1])prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())else:self.query_dict.setlist(self.page_param, [1])prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())page_str_list.append(prev)# 页面for i in range(start_page, end_page + 1):self.query_dict.setlist(self.page_param, [i])if i == self.page:ele = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)else:ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)page_str_list.append(ele)# 下一页if self.page < self.total_page_count:self.query_dict.setlist(self.page_param, [self.page + 1])prev = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())else:self.query_dict.setlist(self.page_param, [self.total_page_count])prev = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())page_str_list.append(prev)# 尾页self.query_dict.setlist(self.page_param, [self.total_page_count])page_str_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))search_string = """<li><form style="float: left;margin-left: -1px" method="get"><input name="page"style="position: relative;float:left;display: inline-block;width: 80px;border-radius: 0;"type="text" class="form-control" placeholder="页码"><button style="border-radius: 0" class="btn btn-default" type="submit">跳转</button></form></li>"""page_str_list.append(search_string)page_string = mark_safe("".join(page_str_list))return page_string
  • 2.前端修改
<div class="clearfix"><ul class="pagination">{{ page_string }}</ul></div>
  • 3.视图函数
def pretty_list(request):""" 靓号列表 """data_dict = {}search_data = request.GET.get('q', "")if search_data:data_dict["mobile__contains"] = search_dataqueryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")page_object = Pagination(request, queryset)context = {"search_data": search_data,"queryset": page_object.page_queryset,  # 分完页的数据"page_string": page_object.html()  # 页码}return render(request, 'pretty_list.html', context)
  • 4.效果展示

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

常见的排序算法——归并排序(三)

本文记述了归并排序的 3 项改进和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 本文实现了《算法(第4版)》书中提到的 3 项改进,对小规模子数组使用插入排序。减少在小规模数组中的递归调用能改进整个算法。 测试数组是否已经有序。任意有序的子…

团队作业4.7——Scrum Day 7(2024.5.13)

Scrum冲刺博客集合Scrum冲刺博客 链接第1篇Scrum冲刺博客 https://www.cnblogs.com/Shangrila12581/p/18181060第2篇Scrum冲刺博客 https://www.cnblogs.com/Shangrila12581/p/18181084第3篇Scrum冲刺博客 https://www.cnblogs.com/Shangrila12581/p/18182774第4篇Scrum冲刺博客…

u-boot网络移植

使用的板子为正点原子的开发板,移植官方当前最新的u-boot修改网口配置信息 主要修改设备树的信息,设备树位于:arch/arm/dts/imx6ul-14x14-evk.dtsi 硬件电路图修改fec2信息 未修改前的信息如下:修改网口1器件的ID信息,网口1使用的ID是0&fec2 {pinctrl-names = "d…

C#循环体特点

C#循环体特点 while 先判断条件,后执行循环体每次执行,均需先验证条件,比如读取每一行数据前检查是否有数据 do...while 先执行1次循环体,再判断条件,第一次执行无需验证条件,比如输入密码,若错误则重新输入 for 与循环次数有关的元素都放在(::)里面,已知循环次数,…

【Azure Contianer Apps】在云上使用容器应用时收集日志遇见延迟问题

问题描述 把应用部署到Azure Container Apps(容器应用),可以在Container App Environemnt级别设置诊断日志,把日志收集到Event Hub / Log Analystic Workspace / Storage Account中。 虽然,这样能把日志导出到目标源中。但在检查日志时候,发现延迟很大,通常要等待7-10分钟…

Rust winit 0.30.0版本简介

不久前,Rust著名的跨平台窗体管理库winit发布了它的0.30.0版本,较之前的0.2x.x版本,新增了19个的模块API,改动大约19个模块API,移除了大约8个模块API。可见本次升级改动之大,主要是对事件循环、窗口管理的重构。鉴于目前网上较多的文章都是基于0.2x版本的winit的代码,存…

4-常用标签

标题标签<h1> - <h6>为了使网页更具有语义化,我们经常会在页面中用到标题标签。HTML提供了6个等级的网页标题加了标题的文字会变的加粗,字号也会一次变大。 一个标题独占一行段落和换行标签在网页中,要把文字有条理地显示出来,就需要将这些文字分段显示。在HTM…

智慧安防系统:构建更安全的社区环境

随着科技的不断进步,人们的生活质量得到了显著提高。然而,与此同时,社会治安问题也日益凸显。为了维护社会的和谐稳定,提高人们的生活安全感,智慧安防系统应运而生。本文将为您详细介绍智慧安防系统的项目背景、需求分析、建设目标、建设内容、技术方案、安全设计以及结语…