5-Django项目--分页与搜索(资产页面)

目录

views/asset_data.py

asset_data/asset_data.html

搜索与分页笔记:

搜索

整数搜索

字符串搜索

分页


views/asset_data.py

# -*- coding:utf-8 -*-
from django.shortcuts import render, redirect, HttpResponse
from django.utils.safestring import mark_safe
from demo_one import models
from django import forms
import random
# 正则校验
from django.core.validators import RegexValidator
# 异常类
from django.core.exceptions import ValidationError# 资产信息展示
def asset_data(request):# 直接写入列表数据data_time = ["2024-5-14", "2024-5-13", "2024-5-12", "2024-5-11", "2024-5-10", "2024-5-18"]name_list = ["一灯大师", "马青雄", "马钰", "小沙弥", "木华黎", "丘处机", "沈青刚","书生", "天竺僧人", "王处一", "王罕", "尹志平", "包惜弱", "冯衡","孙不二", "札木合", "华筝", "李萍", "刘玄处", "刘瑛姑", "吕文德","乔寨主", "曲三", "曲傻姑", "全金发", "汤祖德", "朱聪", "陈玄风","灵智上人", "陆乘风", "陆冠英", "沙通天", "完颜洪烈", "完颜洪熙", "吴青烈","杨铁心", "余兆兴", "张阿生", "张十五", "忽都虎", "欧阳峰", "欧阳克","者勒米", "周伯通", "段天德", "郭靖", "郭啸天", "郝大通", "洪七公","姜文", "柯镇恶", "枯木", "南希仁", "胖妇人", "胖丐", "胖子","都史", "钱青健", "桑昆", "铁木真", "盖运聪", "黄蓉", "黄药师","梁子翁", "梅超风", "渔人", "博尔忽", "博尔术", "程瑶迦", "韩宝驹","焦木和尚", "鲁有脚", "穆念慈", "彭长老", "彭连虎", "童子", "窝阔台","简管家", "裘千仞", "裘千丈", "瘦丐", "察合台", "酸儒文人", "谭处端", ]for name in name_list:number = str(name_list.index(name) + 1)if len(number) <= 1:number = "2024" + "00" + number# models.Asset.objects.create(name=name, mobile=f"153{random.randint(11111111, 99999999)}",#                             data_time=random.choice(data_time), data_id=number)elif len(number) <= 2:number = "2024" + "0" + number# models.Asset.objects.create(name=name, mobile=f"153{random.randint(11111111, 99999999)}",#                             data_time=random.choice(data_time), data_id=number)else:number = "2024" + number# models.Asset.objects.create(name=name, mobile=f"153{random.randint(11111111, 99999999)}",#                             data_time=random.choice(data_time), data_id=number)# data_list = models.Asset.objects.filter(data_id__contains="00")# 搜索dict_data = {}# 获取搜索框当中的内容value = request.GET.get("search")# 如果value有值,则进行搜索,没有值,全部展示if value:# 字典的键是查询条件,值是查询的内容dict_data["data_id__contains"] = value# print(data_list)# 分页page = int(request.GET.get("page", 1))  # 当前所在的页面page_size = 10  # 每页展示十条信息# 寻找切片的开始和结束start = (page-1) * page_sizeend = page * page_size# 字典当中如果有条件,则根据条件进行查询,如果是空,则查询全部,最终返回列表格式data_list = models.Asset.objects.filter(**dict_data)[start:end]# 查询总共有多少条数据data_asset_count = models.Asset.objects.filter(**dict_data).count()# 总数除以10,如果有余数,则单独添加一页page_count, div = divmod(data_asset_count, page_size)if div:page_count += 1# 见算出当前页的前两页和后两页plus = 2# 如果当前数据表的总页码小于 5页if page_count <= 2*plus + 1:start_page = 1end_page = page_countelse:# 当前选中的页数小于等于三if page <= plus:start_page = 1end_page = 2 * plus + 1else:# 当前页 + 2if(page + plus) > page_count:start_page = page_count - plus * 2end_page = page_countelse:start_page = page - plusend_page = page + plus# 存放分页的li标签page_str_list = []# 首页page_str_list.append(f'<li><a href="?page=1" aria-label="Previous"><span aria-hidden="true">首页</span></a></li>')# 上一页if page > 1:page_str_list.append(f'<li><a href="?page={page -1}" aria-label="Previous"><span aria-hidden="true">«</span></a></li>')else:page_str_list.append(f'<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li>')for page_num in range(start_page, end_page+1):if page_num == page:page_ele = f'<li class="active"><a href="?page={page_num}">{page_num}</a></li>'else:page_ele = f'<li><a href="?page={page_num}">{page_num}</a></li>'page_str_list.append(page_ele)# 下一页if page < page_count:page_str_list.append(f'<li><a href="?page={page+1}" aria-label="Next"><span aria-hidden="true">»</span></a></li>')else:page_str_list.append(f'<li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li>')# 尾页page_str_list.append(f'<li><a href="?page={page_count}" aria-label="Previous"><span aria-hidden="true">尾页</span></a></li>')# 将列表当中的字符串传递给html,并且一标签的形式展示page_string = mark_safe("".join(page_str_list))return render(request, "asset_data/asset_data.html", {"data_list": data_list,"page_string": page_string})# 添加资产
class Addasset(forms.ModelForm):# 创建一个手机号输入框,校验手机号的格式mobile = forms.CharField(label="手机号",validators=[RegexValidator(r"^1[3-9]\d{9}$", "请输入正确格式的手机号")])class Meta:model = models.Assetfields = ["name", "mobile", "data_time", "data_id", "ret_data"]# 排除某些字段# exclude = ["name"]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs = {"class": "form-control", "autocomplete": "off"}# 数据库做重复值判断 clean_字段(self)def clean_data_id(self):# 获取页面input框输入的资产编号data_id_txt = self.cleaned_data["data_id"]# 进入数据库,判断输入的资产编号是否存在# .exists() filter条件满足,则返回Trueexists = models.Asset.objects.filter(data_id=data_id_txt).exists()if exists:raise ValidationError("该资产已经被借用")# 如果资产编号不在数据库,则返回编号return data_id_txt# 增加资产信息
def add_asset(request):title = "添加资产"if request.method == "GET":form = Addasset()return render(request, "asset_data/add_modify.html", {"title": title, "form": form})form = Addasset(data=request.POST)if form.is_valid():form.save()return redirect("/asset/data/")return render(request, "asset_data/add_modify.html", {"title": title, "form": form})class Modifyasset(forms.ModelForm):data_time = forms.CharField(disabled=True, label="借用时间")class Meta:model = models.Assetfields = "__all__"def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs = {"class": "form-control", "autocomplete": "off"}def clean_data_id(self):# 获取页面input框输入的资产编号data_id_txt = self.cleaned_data["data_id"]# 进入数据库,判断输入的资产编号是否存在# .exists() filter条件满足,则返回True# exclude(id=self.instance.pk) 忽略当前字段,你某个值的验证exists = models.Asset.objects.exclude(id=self.instance.pk).filter(data_id=data_id_txt).exists()if exists:raise ValidationError("该资产已经被借用,请重新修改")# 如果资产编号不在数据库,则返回编号return data_id_txt# 修改信息
def modify_asset(request, nid):title = "编辑资产信息"data_obj = models.Asset.objects.filter(id=nid).first()if request.method == "GET":form = Modifyasset(instance=data_obj)return render(request, "asset_data/add_modify.html", {"title": title, "form": form})form = Modifyasset(data=request.POST, instance=data_obj)if form.is_valid():form.save()return redirect("/asset/data/")return render(request, "asset_data/add_modify.html", {"title": title, "form": form})# 删除操作
def delete_asset(request, nid):models.Asset.objects.filter(id=nid).delete()return redirect("/asset/data/")

asset_data/asset_data.html

{% extends "index/index.html" %}{% block content %}<div class="container"><div style="margin-bottom: 10px"><a class="btn btn-success" href="/add/asset/"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span>添加资产</a><div style="float: right;width: 300px"><form method="get"><div class="input-group"><input type="text" class="form-control" placeholder="请输入资产编号" name="search"><span class="input-group-btn"><button class="btn btn-default" type="submit">Go!</button></span></div></form></div></div><div class="panel panel-warning"><div class="panel-heading"><h3 class="panel-title">资产表</h3></div><div class="panel-body"><table class="table"><thead><tr><th>id</th><th>姓名</th><th>电话</th><th>借用日期</th><th>资产编号</th><th>归还状态</th><th>操作</th></tr></thead><tbody>{% for data in data_list %}<tr><th>{{ data.id }}</th><td>{{ data.name }}</td><td>{{ data.mobile }}</td><td>{{ data.data_time }}</td><td>{{ data.data_id }}</td>{% if data.ret_data == 1 %}<td style="color: green">{{ data.get_ret_data_display }}</td>{% else %}<td style="color: red">{{ data.get_ret_data_display }}</td>{% endif %}<td><a href="/modify/{{ data.id}}/asset/"><span style="color: green" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a><a href="/delete/{{ data.id}}/asset/"><span style="color: red" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a></td></tr>{% endfor %}</tbody></table></div></div><ul class="pagination">{{ page_string }}</ul></div>
{% endblock %}

搜索与分页笔记:

搜索

models.Asset.objects.filter(name="Sakura",id=1)
  • 整数搜索

    # 搜索id为1的数据
    models.Asset.objects.filter(id=1)
    ​
    # 搜索id大于1的数据
    models.Asset.objects.filter(id__gt=1)
    ​
    # 搜索id大于等于1的数据
    models.Asset.objects.filter(id__gte=1)
    ​
    # 搜索id小于1的数据
    models.Asset.objects.filter(id__lt=1)
    ​
    # 搜索id小于等于1的数据
    models.Asset.objects.filter(id__lte=1)
  • 字符串搜索

    # 包含在内
    models.Asset.objects.filter(data_id__contains="2024")
    # 搜索开头
    models.Asset.objects.filter(data_id__startswidth="2024")
    # 搜索结尾
    models.Asset.objects.filter(data_id__endswidth="2024")

分页

1、每一页展示10条数据models.Asset.objects.filter(**dict_data)[0~9]    第一页models.Asset.objects.filter(**dict_data)[10~19]  第二页models.Asset.objects.filter(**dict_data)[20~29]  第一页
2、计算数据表总共有多少条数据:page = 500 / 10   (50页)page = 501 / 10   (51页)
3、页面只展示五个li标签如果在第一页, 则展示1,2,3,4,5如果在第三页, 则展示1,2,3,4,5如果在第四页, 则展示2,3,4,5,6如果总页数小于5页开始页 1结束页  总页数否则如果当前选择的是第一页或者第二页开始页=1结束页=5如果总共有20页16,17,18,19,20否则,在其他页面比如点到了第九页开始页 = page - plue结束页 = page + plue

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

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

相关文章

从零开始:如何用Electron将chatgpt-plus.top 打包成EXE文件

文章目录 从零开始&#xff1a;如何用Electron将chatgpt-plus.top 打包成EXE文件准备工作&#xff1a;Node.js和npm国内镜像加速下载初始化你的Electron项目创建你的Electron应用运行你的Electron应用为你的应用设置图标打包成EXE文件结语 从零开始&#xff1a;如何用Electron将…

Linux系统安装APITable详细流程与远程访问本地平台数据分析

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前言 v…

Java中连接Mongodb进行操作

文章目录 1.引入Java驱动依赖2.快速开始2.1 先在monsh连接建立collection2.2 java中快速开始2.3 Insert a Document2.4 Update a Document2.5 Find a Document2.6 Delete a Document 1.引入Java驱动依赖 注意&#xff1a;启动服务的时候需要加ip绑定 需要引入依赖 <dependen…

Echarts柱状图数据太多,自定义长度之后,自适应浏览器缩放

不知道是不是最优解&#xff0c;但是当前解决了我遇到的问题&#xff0c;如有更好的方法&#xff0c;希望看到这篇文章的同学可以不吝指导一番&#xff0c;非常感谢 1、问题描述&#xff1a; 因Ecahrts柱状图数据有时多有时少&#xff0c;所以在数据达到一定程度之后&#xff…

java版CRM客户关系管理系统源码:CRM客户关系管理系统的功能详解

CRM客户关系管理系统是一款功能全面的客户管理工具&#xff0c;旨在帮助企业和销售团队提高客户管理效率&#xff0c;优化销售流程。该系统包含多个模块&#xff0c;覆盖了从线索到回款的全流程管理&#xff0c;为用户提供了一个集成化的客户关系管理平台。 一、待办事项模块&a…

Go语言-切片底层探索 —— 补充篇:切片和底层数组到底是什么关系?

之前的切片探索中&#xff0c;上篇通过一道算法题目&#xff0c;了解到切片的两大特性&#xff1a;一是&#xff1a;切片是引用类型&#xff0c;指向底层数组&#xff0c;修改其底层数组的时候&#xff0c;会影响切片中的值。二是&#xff1a;向切片中添加元素的时候&#xff0…

面试(03)————多线程

目录 一、线程和进程的区别&#xff1f; 二、并行和并发的区别&#xff1f; 三、线程创建的方式有哪些&#xff1f; 3.1、继承Thread类 3.2、实现Runnable接口 3.3、实现Callable接口 3.4、线程池 四、Runnable和Callable的区别&#xff1f; 五、在启动线程的时候&am…

Rocky Linux安装与基础配置

目录 背景与起源 主要特点 目标用户 发展前景 下载 安装 常用配置命令&#xff1a; 更换镜像源 Rocky Linux 是一个开源的、由社区驱动的操作系统&#xff0c;旨在使用 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源码构建的下游二进制兼容发行版。以下是关于…

Ubuntu22.04之解决:terminal使用alt+1/alt+2/alt+3失效问题(二百三十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

2024050401-重学 Java 设计模式《实战代理模式》

重学 Java 设计模式&#xff1a;实战代理模式「模拟mybatis-spring中定义DAO接口&#xff0c;使用代理类方式操作数据库原理实现场景」 一、前言 难以跨越的瓶颈期&#xff0c;把你拿捏滴死死的&#xff01; 编程开发学习过程中遇到的瓶颈期&#xff0c;往往是由于看不到前进…

趣测小程序开发搭建,趣测趣玩小程序是何物?

一、趣测小程序简介 趣测趣玩小程序是一款提供趣味测试和玩乐功能的应用程序。用户可以通过该小程序参与各种有趣的测试&#xff0c;这些测试可能涵盖性格、情感、智力等多个方面&#xff0c;旨在为用户提供轻松愉快的体验。同时&#xff0c;该小程序还可能包含一些游戏元素&a…

Spring boot 随笔 1 DatasourceInitializer

0. 为啥感觉升级了 win11 之后&#xff0c;电脑像是刚买回来的&#xff0c;很快 这篇加餐完全是一个意外&#xff1a;时隔两年半&#xff0c;再看 Springboot-quartz-starter 集成实现的时候&#xff0c;不知道为啥我的h2 在应用启动的时候&#xff0c;不能自动创建quartz相关…

Vue3项目炫酷实战,检测密码强度值

在前端项目开发中&#xff0c;确保用户密码的强度是保护账户安全的重要措施。本文将演示如何使用Vue 3实现一个简单的密码强度检测功能。通过实时反馈&#xff0c;帮助用户创建更安全的密码&#xff0c;从而提升整体系统的安全性。无论您是前端开发新手还是经验丰富的开发者&am…

Vue2指令

本节目标 掌握vue指令 定义常用指令案例-小黑记事本指令修饰符 介绍 指令就是带有v-前缀的标签属性, 不同的指令, 可以实现不同的功能 常用指令 渲染指令 语法: v-html 动态渲染标签作用: 动态设置元素的innerHTML场景: 用来动态解析标签 语法: v-text 动态渲染文本会…

气膜羽毛球馆如何提升运动体验—轻空间

随着人们对健康和运动的关注度日益增加&#xff0c;羽毛球作为一项受欢迎的运动&#xff0c;得到了越来越多人的喜爱。而气膜羽毛球馆&#xff0c;以其独特的优势&#xff0c;正在改变传统羽毛球馆的运动体验。那么&#xff0c;气膜羽毛球馆是如何提升运动体验的呢&#xff1f;…

神经网络 torch.nn---Non-Linear Activations (ReLU)

ReLU — PyTorch 2.3 documentation torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) 非线性变换的目的 非线性变换的目的是为神经网络引入一些非线性特征&#xff0c;使其训练出一些符合各种曲线或各种特征的模型。 换句话来说&#xff0c;如果模型都是直线特征的…

C#之EntityFramework的应用

目录 1&#xff0c;名词概述。 2&#xff0c;实体数据模型EDM介绍。 3&#xff0c;规范函数。 4&#xff0c;查看Linq转换成的SQL语句。 5&#xff0c;数据的增删改查。 5.1&#xff0c;数据查询 5.2&#xff0c;数据插入 5.3&#xff0c;数据更新 5.4&#xff0c;数据…

【android】设置背景图片

改变值&#xff0c;可显示zai在 在theves下面的两个value都要增加名字代码 <item name"windowActionBar">false</item><item name"android:windowNoTitle">true</item><item name"android:windowFullscreen">tru…

Base64前端图片乱码转换

title: Base64码乱转换 date: 2024-06-01 20:30:28 tags: vue3 后端图片前端显示乱码 现象 后端传来一个图片&#xff0c;前端能够接收&#xff0c;但是console.log()后发现图片变成了乱码&#xff0c;但是检查后台又发现能够正常的收到了这张图片。 处理方法 笔者有尝试将…

联想Y410P跑大模型

安装vs 2017 查看GPU版本 查看支持哪个版本的cuda windows cuda更新教程_cuda 12.0-CSDN博客 下载并安装cuda tookit 10.1 CUDA Toolkit 10.1 Update 2 Archive | NVIDIA Developer 找到下载的文件&#xff0c;安装 参考安装链接 Win10 Vs2017 CUDA10.1安装&#xff08;避坑…