◢Django 分页+搜索

1、搜索数据

从数据库中获取数据,并进行筛选,xx__contains = q作为条件,查找的是xx列中有q的所有数据条

当有多个筛选条件时,将条件变成一个字典,传入 **字典 ,ORM会自行翻译并查找。

筛选电话号码这一列,若数据量过少,使用random库多次生成

<!DOCTYPE html>
{% load static %}
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="{% static '/js/jquery-3.6.0.min.js' %}"></script><style>@import "{% static 'css/tab.css' %}";</style>
</head>
<body>
<form method="get">
<input type="text" name="search"><button type="submit">搜索</button>
</form>
<hr>
<table><tr><td>ID</td><td>号码</td><td>价格</td><td>等级</td><td>状态</td></tr>{% for i in data %}<tr><td>{{ i.id }}</td><td>{{ i.phone }}</td><td>{{ i.price }}</td><td>{{ i.level }}</td><td>{{ i.get_status_display }}</td></tr>{% endfor %}
</table>
</body>
</html>
def in4(request):if request.method == 'GET':data_dict = {}search = request.GET.get('search')print(search)if search:data_dict['phone__contains'] = search# 获取数据库的数据querset = models.User.objects.filter(**data_dict).order_by('level')return render(request,'in4.html',{"data":querset})

输入筛选条件, 点击搜索,会自动更新页面并清除输入框中的内容

return 加入search,在input框中加入显示搜索的数据

placeholder="{{ search }}"

 2、加入分页

按照上节直接加上,会导致搜索与分页不能同时存在,要对page与search进行url拼接【字典.urlencode()】

request请求传递过来的参数,不允许对其进行更改,先对其进行深拷贝,在拷贝出的数据上进行page与search两个参数的修改。

import copy
req = copy.deepcopy(request.GET)#深拷贝get请求
req._mutable = Truereq.setlist(key,iter)#iter必须是可迭代对象req.urlencode()

设置一页显示的最大数据条数,获取page参数 ,对筛选后的数据进行分页截取,设置起始页与结束页至当前页的最大距离,循环设置分页的页码

import copy
req = copy.deepcopy(request.GET)#深拷贝get请求
req._mutable = Truepage_size = 10
if request.GET.get('page'):current_page = int(request.GET.get('page'))
else:current_page = 1
page_count, count = divmod(data_count, page_size)  # 共有多少页
if count:page_count += 1
# 获取数据的起始位置与结束位置
start = int(current_page - 1) * page_size
if current_page == page_count:  # 当前页是最后一页时,数据并不是page_size条数据end = data_count
else:end = int(current_page) * page_size
print(start, end)
data = querset[start:end]#从筛选后的数据中进行的分页数据#设置分页最大显示
plus = 3
if current_page <= plus + 1:start_page = 1
else:start_page = current_page - plus
# 当前页大于等于最终点页 结束页始终为终点页 ;当前页小于终点页减plus 结束页为当前页+plus
if current_page >= page_count - plus:end_page = page_count
else:end_page = current_page + plus
#在筛选好的数据基础上,点击2页时不会使得search条件失去效果
page_string = ''
for i in range(start_page, end_page+1):req.setlist('page',[i])if i == current_page:#为活动页增加样式,突出显示当前页page_string += f"<span style='background-color:#fff;'><a style='color:#000' href=?{req.urlencode()}>{i}</a></span>"else:page_string += f"<span><a href=?{req.urlencode()}>{i}</a></span>"page_string = mark_safe("".join(page_string))
return render(request,'in4.html',{"data":data,"page_string":page_string})

 3、上一页与下一页

在点击页码的情况下增加上一页下一页的按钮,当前看到的最后页码变为第一个页码。

看见第一页不显示上一页按钮,同样最后一页也不带按钮。

处于看不见首页,但又不超过加减页时,点击上一页会跳出合适的页码,应当设置page=1,拉回跳转位置,放置page变为负数,尾页也一样。

页码满足加减页时,实行最后一个页码变第一个页码,在当前页的页码基础上 加上 或 减去 plus的2倍

def  in4(request):...if current_page <= plus + 1:pre = ''else:if current_page <= plus * 2:  # 当前页处于大于1个plus,小于2个plus页时,点击上一页,跳转到第1页req.setlist('page',[1])pre = f'<span class="updown"><a href=?{req.urlencode()}>首页</a></span>'else:req.setlist('page', [current_page - plus * 2])pre = f'<span class="updown"><a href=?{req.urlencode()}>上一页</a></span>'# 下一页同上一页一致if current_page >= page_count - plus:next = ''else:if current_page >= page_count - plus * 2:req.setlist('page',[page_count])next = f'<span class="updown"><a href=?{page_count}>尾页</a></span>'else:req.setlist('page',[current_page + plus * 2])next = f'<span class="updown"><a href=?{req.urlencode()}>下一页</a></span>'

4、封装

建立软件包,命名为utils

 在utils中建立SplitPage.py,整合前面程序,该封装的封装,该方法体的方法体,page_size与plus进行内定义

from django.utils.safestring import mark_safe
import copy
class Splitpagenumber:def __init__(self,request,queryset,page_size=10,plus=3):#确实获取到page,若没有则默认为首页if request.GET.get('page'):self.current_page = int(request.GET.get('page'))else:self.current_page = 1#拷贝get,为后续使用做准备req = copy.deepcopy(request.GET)req._mutable = Trueself.req = req#计算页码总数self.page_count,count = divmod(queryset.count(),page_size)if count:self.page_count += 1#为筛选好的数据进行分页start = int(self.current_page - 1) * page_sizeif self.current_page == self.page_count:end = queryset.count()else:end = int(self.current_page) * page_sizeself.page_data = queryset[start:end]  # 从筛选后的数据中进行的分页数据#self.plus=plusdef html(self):if self.current_page <= self.plus + 1:start_page = 1pre = ''else:start_page = self.current_page - self.plusif self.current_page <= self.plus * 2:  self.req.setlist('page',[1])pre = f'<span class="updown"><a href=?{self.req.urlencode()}>首页</a></span>'else:self.req.setlist('page', [self.current_page - self.plus * 2])pre = f'<span class="updown"><a href=?{self.req.urlencode()}>上一页</a></span>'if self.current_page >= self.page_count - self.plus:end_page = self.page_countbehe=''else:end_page = self.current_page + self.plusif self.current_page >= self.page_count - self.plus * 2:self.req.setlist('page',[self.page_count])behe = f'<span class="updown"><a href=?{self.page_count}>尾页</a></span>'else:self.req.setlist('page',[self.current_page + self.plus * 2])behe = f'<span class="updown"><a href=?{self.req.urlencode()}>下一页</a></span>'# 在筛选好的数据基础上,点击2页时不会使得search条件失去效果page_string = ''page_string += prefor i in range(start_page, end_page + 1):self.req.setlist('page', [i])if i == self.current_page:page_string += f"<span style='background-color:#fff;'><a style='color:#000' href=?{self.req.urlencode()}>{i}</a></span>"else:page_string += f"<span><a href=?{self.req.urlencode()}>{i}</a></span>"page_string += behepage_string = mark_safe("".join(page_string))return page_string

5、使用封装好的分页搜索

from app02.utils.SplitPage import Splitpagenumber
def in5(request):data_dict={}search = request.GET.get('search')if search:data_dict['phone__contains'] = searchqueryset = models.User.objects.filter(**data_dict)page_obj = Splitpagenumber(request,queryset)#传递筛选好的数据data = page_obj.page_datapage_string = page_obj.html()context={"search":search,"data": data,"page_string": page_string}return render(request,'in5.html',context)
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="{% static '/js/jquery-3.6.0.min.js' %}"></script><style>@import "{% static 'css/tab.css' %}";*{padding: 0;list-style: none;margin: 0;}span{display: inline-block;width: 40px;text-align: center;font-size: 20px;border: 1px solid;background-color: #2aabd2;}a{text-decoration: none;color: white;}div{width: 1200px;}aside{width: 800px;margin: 0 auto;}.data{width: 300px;height: 225px;border: 1px solid #8a6d3b;margin-bottom: 30px;}.updown{display: inline-block;width: 80px;}.updown a{font-size: 15px;line-height: 20px;}</style>
</head>
<body>
<form method="get">
<input type="text" name="search" placeholder="{{ search }}"><button type="submit">搜索</button>
</form>
<hr style="margin-bottom: 10px;">
<table><tr><td>ID</td><td>号码</td><td>价格</td><td>等级</td><td>状态</td></tr>
{#    插入数据条#}{% for i in data %}<tr><td>{{ i.id }}</td><td>{{ i.phone }}</td><td>{{ i.price }}</td><td>{{ i.level }}</td><td>{{ i.get_status_display }}</td></tr>{% endfor %}
</table>
<ul>{{ page_string }}
</ul>
</body>
</html>

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

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

相关文章

Java获取指定日期到当前日期的差距

Java获取指定日期到当前日期的差距 一、指定日期到今天的y年m月d日 private JSONObject getYesrMonthDay(String dataParam){JSONObject res new JSONObject();/*只比较年月日&#xff0c;不要时间*/DateTimeFormatter df DateTimeFormatter.ofPattern("yyyy-MM-dd&quo…

在Go编程中调用外部命令的几种场景

1.摘要 在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库中, 专门提供了os/exec包来对调用外部程序提供支持, 本文将对调用外部命令的几种使用方法进行总…

【机器学习】034_多层感知机Part.2_从零实现多层感知机

一、解决XOR问题 1. 回顾XOR问题&#xff1a; 如图&#xff0c;如何对XOR面进行分割以划分四个输入 对应的输出 呢&#xff1f; 思路&#xff1a;采用两个分类器分类&#xff0c;每次分出两个输入 &#xff0c;再借助这两个分类从而分出 。 即采用同或运算&#xff0c;当两…

通过easyexcel实现数据导入功能

上一篇文章通过easyexcel导出数据到excel表格已经实现了简单的数据导出功能&#xff0c;这篇文章也介绍一下怎么通过easyexcel从excel表格中导入数据。 目录 一、前端代码 index.html index.js 二、后端代码 controller service SongServiceImpl 三、功能预览 四、后端…

WordPress画廊插件Envira Gallery v1.9.7河蟹版下载

Envira Gallery是一款功能强大的WordPress画廊插件。通过使用这个插件&#xff0c;你可以在WordPress的前台页面上创建出令人赏心悦目的图片画廊展示形式。 拖放生成器&#xff1a;轻松创建精美照片和视频画廊 自定义主题&#xff0c;打造独特外观 使用预设模板&#xff0c;为…

分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测

分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测 目录 分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现基于PSO-SDAE粒子群优化算法…

使用树莓派学习Linux系统编程的 --- 库编程(面试重点)

在之前的Linux系统编程中&#xff0c;学习了文件的打开&#xff1b;关闭&#xff1b;读写&#xff1b;进程&#xff1b;线程等概念.... 本节补充“Linux库概念 & 相关编程”&#xff0c;这是一个面试的重点&#xff01; 分文件编程 在之前的学习中&#xff0c;面对较大的…

算法---相等行列对

题目 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid &#xff0c;返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和列以相同的顺序包含相同的元素&#xff08;即相等的数组&#xff09;&#xff0c;则认为二者是相等的。 示例 1&#xff1a; 输入&…

原理Redis-Dict字典

Dict 1) Dict组成2) Dict的扩容3) Dict的收缩4) Dict的rehash5) 总结 1) Dict组成 Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别…

无重复最长字符串(最长无重复子字符串),剑指offer,力扣

目录 原题&#xff1a; 力扣地址&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 难度算中下吧&#xff0c;这个总体不算很难&#xff0c;而且滑动窗口&#xff0c;以及哈希都比较常见 审题目事例提示&#xff1a; 解题思路&#xff08;…

vue3 setup展示数据

效果图 1.创建数据 content.js import { reactive } from vueconst data reactive({color:red,title: 二十四节气,subTitle: 节气&#xff0c;是干支历中表示自然节律变化以及确立“十二月建”&#xff08;月令&#xff09;的特定节令。,list: [{name: "立春",con…

代码随想录-刷题第二天

977. 有序数组的平方 题目链接&#xff1a;977. 有序数组的平方 思路&#xff1a;双指针思想&#xff0c;数组是有序的且含有负数&#xff0c;其中元素的平方一定是两边最大。定义两个指针&#xff0c;从两端开始向中间靠近&#xff0c;每次比较两个指针的元素平方大小&#…

线上bug-接口速度慢

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

腾讯云助力港华能源上线“碳汭星云2.0”,推动能源行业绿色低碳转型

11月17日&#xff0c;港华能源与腾讯云联合打造的港华智慧能源生态平台“碳汭星云2.0”升级上线。依托双方的连接、大数据能力和行业深耕经验&#xff0c;该平台打破了园区“数据孤岛”&#xff0c;进一步提升了数据治理、应用集成和复制推广能力&#xff0c;未来有望以综合能源…

【小呆的力学笔记】有限元专题之循环对称结构有限元原理

文章目录 1. 循环对称问题的提出2. 循环对称条件2.1 节点位移的循环对称关系2.2 节点内力的循环对称关系 3. 在平衡方程中引入循环对称条件 1. 循环对称问题的提出 许多工程结构都是其中某一扇面的n次周向重复&#xff0c;也就是是周期循环对称结构。如果弹性体的几何形状、约…

【每日刷题——语音信号篇】

思考与练习 练习2.1 语音信号在产生的过程中&#xff0c;以及被感知的过程中&#xff0c;分别要经过人体的哪些器官&#xff1f; 1.产生过程&#xff1a; 肺部空气 → \rightarrow →冲击声带 → \rightarrow →通过声道&#xff08;可以调节&#xff09; → \rightarrow →…

IDEA自动注解设置(中文版)

IDEA自动注解设置 1、添加类自动注释 文件 - 设置 - 编辑器 - 文件和代码模板 - Include - File Header /** *description&#xff1a;TODO *author&#xff1a; ${USER} *create&#xff1a; ${DATE} ${TIME} */2、添加类方法自动注释 文件 - 设置 - 编辑器 - 实时模版 - …

沸点 | Ultipa 图数据库金融应用场景优秀案例首批入选,金融街论坛年会发布

为推进图数据库在金融行业的创新应用试点&#xff0c;近日&#xff0c;在2023金融街论坛年会“全球金融科技中心网络年会暨ZIBS北京论坛”上&#xff0c;北京前沿金融监管科技研究院发布了基于国际标准组织——国际关联数据基准委员会&#xff08;LDBC&#xff09;的《图数据库…

Unexpected WSL error

问题描述 启动 Docker Desktop 报错 Unexpected WSL error&#xff0c;报错完整信息如下&#xff1a; Docker Desktop - Unexpected WSL error An unexpected error was encountered while executing a WSL command, Commoncauses include access rights issues, which occur…

阿里云ack集群升级流程

最近一直在升级过期的ack 集群版本 从1.22升级到1.24.。 参考&#xff1a; 升级流程、方式及所需时间