◢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 = True

req.setlist(key,iter)#iter必须是可迭代对象

req.urlencode()

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

import copy
req = copy.deepcopy(request.GET)#深拷贝get请求
req._mutable = True

page_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 = True
        self.req = req

        #计算页码总数
        self.page_count,count = divmod(queryset.count(),page_size)
        if count:
            self.page_count += 1

        #为筛选好的数据进行分页
        start = int(self.current_page - 1) * page_size
        if self.current_page == self.page_count:
            end = queryset.count()
        else:
            end = int(self.current_page) * page_size
        self.page_data = queryset[start:end]  # 从筛选后的数据中进行的分页数据

        #
        self.plus=plus

    def html(self):
        if self.current_page <= self.plus + 1:
            start_page = 1
            pre = ''
        else:
            start_page = self.current_page - self.plus
            if 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_count
            behe=''
        else:
            end_page = self.current_page + self.plus
            if 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 += pre
        for 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 += behe
        page_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'] = search
    queryset = models.User.objects.filter(**data_dict)
    page_obj = Splitpagenumber(request,queryset)#传递筛选好的数据
    data = page_obj.page_data
    page_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>

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

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

相关文章

2021年3月青少年软件编程(Python)等级考试试卷(一级)

2021年3月青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09;二、判断题&#xff08;共10题&#xff0c;每题…

.NET 8 Video教程介绍(开篇)

教程简介 本文将简单描述视频网站教程&#xff0c;视频网站是一个类似于腾讯视频一样的网站&#xff0c;视频资源用户自己上传&#xff0c;然后提供友好的界面查看视频和搜索视频&#xff0c;并且提供管理页面对于视频进行管理&#xff0c;我们将使用Blazor作为前端&#xff0…

uniapp中实现圆形进度条的方式有哪些?

前言 在uniapp开发小程序或者apk时&#xff0c;页面需要用到一个圆形进度条&#xff08;带文字和百分比的&#xff09;&#xff0c;自己也自定义过一个,但是有一点小问题&#xff0c;咱先展示如何引入插件市场的在介绍自定义的&#xff01;一共四种&#xff0c;但是你需要考虑自…

PPT基础:表格

目录 表格基本功能底纹框线单元格表格美化 表格基本功能 底纹 所在位置&#xff1a;插入图表>>>表设计>>>底纹 底纹&#xff1a;相当于每个单元格的“颜色填充”如何用表格拆分图片 &#xff08;1&#xff09;生成一个表格>>>插入一张图片>>…

高效开发与设计:提效Spring应用的运行效率和生产力 | 京东云技术团队

引言 现状和背景 Spring框架是广泛使用的Java开发框架之一&#xff0c;它提供了强大的功能和灵活性&#xff0c;但在大型应用中&#xff0c;由于Spring框架的复杂性和依赖关系&#xff0c;应用的启动时间和性能可能会受到影响。这可能导致开发过程中的迟缓和开发效率低下。优…

Transformer笔记

Transformer encoder-decoder架构 Encoder&#xff1a;将输入序列转换为一个连续向量空间中的表示。Encoder通常是一个循环神经网络&#xff08;RNN&#xff09;或者卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通过对输入序列中的每个元素进行编码&#xff0c;得到…

[Genode] ARM TrustZone

这是关于读文章ARM TrustZone的记录&#xff0c;原文是英文&#xff0c;刚开始会有点反应不过来&#xff0c;这里大部分是对文章的翻译与提取。 ARM信任区技术 ARM信任区是在 热烈讨论关于X86平台上的可信平台模块&#xff08;TPM&#xff09; 时引入的。。 就像TPM芯片神奇…

nginx学习(3)Nginx 负载均衡

Nginx 负载均衡 实战案例 实现效果 浏览器地址栏输入地址 http://172.31.0.99/oa/a.html&#xff0c;负载均衡效果&#xff0c;平均在 8083 和 8084 端口中&#xff0c;刷新浏览器&#xff0c;显示不同 一、配置 1、先创建2个文件夹&#xff0c;并将apache-tomcat-8.5.87解…

简化业务流程——通知短信API在企业中的应用

引言 通知短信API是一种可以帮助企业简化业务流程的通讯工具。随着移动互联网技术的不断发展&#xff0c;移动通讯已经成为了我们日常生活和企业运营中不可或缺的一部分。通知短信API是一种可以在企业中将移动通讯应用到极致的工具&#xff0c;它可以为企业提供高效便捷的通讯…

[qemu逃逸] XNUCA2019-vexx

前言 这题没有去符合, 题目本身不算难. 用户名: root 密码: goodluck 设备逆向 题目没有去符合, 所以其实没啥好讲了, 就列一些笔者认为关键的地方 这里的定义了两块 mmio 内存区. 然后看下设备实例结构体: 可以看到 QEMUTimer, 所以多半就是劫持 dma_timer 了. 漏洞点在…

【日常总结】java JSON 转 实体类 (含多层嵌套)

一、场景 二、问题 三、解决方案 四、实战 1. 引入maven依赖 2. IEDA 安装lombok 插件 3. 安装 GsonFormPlu 插件 4. 使用 Stage 1&#xff1a;新建类&#xff0c;右键 选择 Generate Stage 2&#xff1a;选择 GsonFormatPlus Stage 3&#xff1a;将json复制其中&…

Linux:详解(yum的使用、vim编辑器命令集合以及gcc/g++编译器的使用)

Linux 软件包管理器 yum 什么是软件包&#xff1a; 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通…

图片地址GPS经纬度查询

先打开exif图片查询的网站&#xff1a; 改图宝的&#xff1a;https://www.gaitubao.com/exif图虫de的:EXIF信息查看器 (tuchong.com) 将这个地点&#xff1a;51 deg 30 51.90" N, 0 deg 5 38.73" W 修改为&#xff1a;5130 51.90" N, 05 38.73" W 到谷…

Java JSON字符串替换其中对应的值

代码&#xff1a; public static void main(String[] args) { // String theData crmScene.getData();String theData "[{\"type\":1,\"values\":[\"审批中\",\"未交付\"],\"name\":\"status\"}]"…

听懂未来:AI语音识别技术的进步与实战

目录 一、引言语音识别技术的魅力与挑战语音识别的基本概念技术的进步与应用实际应用的影响 二、语音识别技术的历史1. 初期探索&#xff08;1950s - 1970s&#xff09;早期的实验 2. 隐马尔可夫模型的兴起&#xff08;1980s&#xff09;算法创新 3. 深度神经网络的应用&#x…

php 时区查看和设置

php的时区&#xff0c;关系到相关时间函数的结果 其他相关&#xff1a; linux时区设置&#xff1a;链接 pgsql时区设置&#xff1a; 一、查看可以用的时区列表 新建一个php文件&#xff0c;输入下面程序即可 <?php echo "<pre>"; var_dump(timezone_id…

Linux系统编程 day03 Makefile、gdb、文件IO

Linux系统编程 day03 Makefile、gdb、文件IO 1. Makefile2. gdb3. 文件IO 1. Makefile Makefile文件中定义了一系列规则来指定哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至更加复杂的功能操作。Makefile就像一个shell脚…

阿里云ack集群升级流程

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

vue.js 短连接 动态连接

有这么一种场景&#xff0c;我们实现了某个业务&#xff0c;现在需要将这个业务连接对外推广以期实现我们的运营、推广、佣金目的&#xff0c;那么我们如何实现呢&#xff1f; 比如这个页面连接为&#xff1a; https://mp.domain.com/user/creation/editor?spm1&userno12…

如何使用 WPF 应用程序连接 FastReport报表

随着期待已久的FastReport WPF的发布&#xff0c;您不再需要使用 FastReport .NET 来处理基于 WPF 的项目。 不久前&#xff0c;在 FastReport .NET 中使用 WPF 还相当不方便。并非一切都进展顺利&#xff1b;连接 FastReport.dll 和许多其他问题存在问题。我们重新思考了该方…