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_size
    end = 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 = 1
        end_page = page_count
    else:
        # 当前选中的页数小于等于三
        if page <= plus:
            start_page = 1
            end_page = 2 * plus + 1
        else:
            # 当前页 + 2
            if(page + plus) > page_count:
                start_page = page_count - plus * 2
                end_page = page_count
            else:
                start_page = page - plus
                end_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.Asset
        fields = ["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条件满足,则返回True
        exists = 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.Asset
        fields = "__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
		

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

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

相关文章

redis安裝启动

1、下载redis解压 https://github.com/tporadowski/redis/releases 2、打开cmd&#xff0c;切换到解压的文件夹 3、redis-server.exe redis.windows.conf 启动redis redis可通过命令行输入config set requirepass password和直接修改redis.config文件中修改 requirepass 来设…

usb的hid报表描述符的数据含义详解

报表描述符组成基本单元item 项目编码有二种&#xff1a;短项目和长项目&#xff0c;长项目仅是保留给未来使用&#xff0c;所以不作介绍。下面是短item时&#xff0c;最后一个字节描述了item种类和尺寸 长item格式如下&#xff1a; 短格式如下 bSize &#xff1a;代表后面的…

kotlin 调用java的get方法Use of getter method instead of property access syntax

调用警告 Person.class public class Person {private String name;Person(String name) {this.name name.trim();}public String getName() {return name;}public void setName(String name) {this.name name;}public String getFullName() {return name " Wang&quo…

PasteCode系列系统说明

定义 PasteCode系列是指项目是基于PasteTemplate构建的五层以上项目&#xff0c;包括不仅限于 Domain EntityFrameworkCore Application.Contracts Application HttpApi.Host 熟悉ABP vNext就很好理解了&#xff0c;因为PasteTemplate就是基于ABP的框架精简而来&#xff01;在…

【Java】static 修饰成员方法

static 修饰成员方法 简介 应用 static 修饰成员方法 1.static 修饰成员方法2.内存原理3.main函数4.类方法的应用 1.static 修饰成员方法 测试类&#xff1a; package suziguang_d2_staticdemo;public class Test {public static void main(String[] args) {// 1.类方法使用/…

体育器材管理系统(Java+MySQL)

技术栈 Java语言&#xff1a;作为主要编程语言&#xff0c;用于编写应用逻辑和界面交互。MySQL数据库&#xff1a;用于存储和管理体育器材的相关数据。Swing窗口视图&#xff1a;用于创建图形用户界面&#xff0c;使用户能够通过窗口进行操作&#xff08;GBK编码&#xff09;。…

电源设计01

嵌入式电源设计 电池容量的计算电路充电时的选择&#xff1a; 科普硬件知识&#xff0c;写写关于电路板电源的事情。各类电源模块实物但为什么硬件工程师又必须要了解电源并且在板内自己设计电源呢&#xff1f;首先是DCDC的降压芯片下面推荐几个升压芯片&#xff1a;LDO 电池容…

vue3+elementPlus实现Radio单选切换显示不同内容

el-radio-group 组件方法&#xff1a; <template><el-radio-group v-model"radio"><el-radio :value"0">阶梯达标</el-radio><el-radio :value"1">限时达标</el-radio></el-radio-group> </templ…

【设计模式深度剖析】【3】【行为型】【职责链模式】| 以购物中心客户服务流程为例加深理解

&#x1f448;️上一篇:命令模式 设计模式-专栏&#x1f448;️ 文章目录 职责链模式定义英文原话直译如何理解呢&#xff1f; 职责链模式的角色1. Handler&#xff08;抽象处理者&#xff09;2. ConcreteHandler&#xff08;具体处理者&#xff09;3. Client&#xff08;客户…

Vue随笔记

1 Idea里面使用Vue Idea里面要安装Vue插件 File - New - Project - JavaScript - Vue.js 然后出现&#xff1a; "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npx-cli.js" --ignore-existing --package vue/cli…

学习串口屏需要了解哪些方面的知识

学习串口屏需要掌握的知识主要包括以下几个方面&#xff1a; 串口通信原理&#xff1a;串口屏是基于串口通信的显示控制模组&#xff0c;因此了解串口通信的基本原理和通信协议是必要的。你需要了解串口通信的基本概念、数据格式、波特率、校验位等参数&#xff0c;以及串口通…

信息学奥赛初赛天天练-21-完善程序-动态规划、编辑距离与字符数组应用的极致探索

PDF文档公众号回复关键字:20240606 1 2023 CSP-J 完善程序2 完善程序&#xff08;单选题&#xff0c;每小题 3 分&#xff0c;共计 30 分&#xff09; 给定两个字符串&#xff0c;每次操作可以选择删除&#xff08;Delete&#xff09;、插入&#xff08;Insert&#xff09;…

一文读懂动态IP与静态IP的区别与选择

在当今的数字世界中&#xff0c;网络安全与隐私保护已成为越来越重要的话题&#xff0c;网络代理作为一种常见的技术工具&#xff0c;被广泛应用于保护用户隐私、绕过网络限制、进行网络测试等诸多领域。 IPFoxy提供独享纯净的动态IP代理与静态IP代理选择&#xff0c;我们需要根…

AI大模型语料库

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 语料库概述 语料库&#xff08;Corpus&#xff09;是一个存储了大量真实语言使用实例的集合&#xff0c;这些实例可以是文本、语音、视频等多种形式的语言数据。语料库通常…

如何将 MySQL 数据库共享给他人?

文章目录 共享所有数据库给他人1. 连接到 MySQL 数据库2. 选择要使用的数据库3. 修改连接所需的 host4. 刷新权限 共享部分数据库给他人1. 创建用户2. 授权3. 刷新权限 结语 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是I…

HCIP-Datacom-ARST自选题库_10_其他判断【23道题】

1.端到端时延等于路径上所有处理时延与队列时延之和。 2.部署PPP Multilink之后&#xff0c;数据将根据源地址和目的地址均匀的分配在各条成员链路上。 3.流镜像分为本地流镜像和远程流镜像两种方式。√ 4.IP报文中用Tos字段进行Q0S标记&#xff0c;Tos字段中是使用前6bit来…

BGP基础实验

BGP协议中的建邻&#xff0c;与宣告路由分开的 在任何一台BGP路由上&#xff0c;均可宣告本地路由表中通过任何形势获取的路由条目&#xff0c;将其共享给其他BGP邻居&#xff1b; 然后display ip rou查看 *>代表状态 *的意思是可用 >代表优 i和*>无关&#x…

数据结构———链表

链表是经常用到的一种基础数据结构&#xff0c;接下来我们讲讲链表。 链表&#xff1a; 特点&#xff1a; 链表可分为有头/无头链表&#xff0c;循环/无环&#xff0c;双向/单向链表&#xff0c;每个链表节点都包含一个数据和下一个链表节点的地址。 每个链表节点都指向下一…

树-层序遍历序列构造二叉树(mid)

一、问题描述 二、实现思路 问题给出了层序遍历序列&#xff0c;我们使用队列来实现二叉树的构造过程&#xff1a; 这里注意&#xff1a;在写代码时&#xff0c;比较字符串数组内元素str和某个字符串是否相等时用str.equals("#")的操作&#xff0c;如果用 会引发比较…

上市即交付,比亚迪秦L DM-i万人交车暨千媒众测开营

6月6日&#xff0c;“引领中级 开创油耗2时代”秦L DM-i万人交车暨千媒众测开营仪式在比亚迪大本营深圳盛大举行。 众多车主代表亲临现场&#xff0c;与全国各地的比亚迪4S店千店联动&#xff0c;将秦L DM-i全国交付推向新的高潮。发布即量产&#xff0c;上市即交付&#xff0…