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

news2024/11/24 2:21:15

目录

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
		

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

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

相关文章

如何使自己写的代码易读易懂?

〓● 如果代码可读性不佳、不容易理解&#xff0c;可能造成如下问题&#xff1a; 〓❏ 其他工程师浪费时间解读它&#xff1b; 〓❏ 误解导致引入缺陷&#xff1b; 〓❏ 其他工程师修改时破坏代码。 〓● 提高代码可读性&#xff0c;有时候可能使其变得更为冗长、占用更多的…

nesting in wrf

Choices for Nesting are:0 no nesting (only available for serial and smpar) 0. no nesting (only available for serial and smpar)1. basic2. preset moves preset moves3. vortex following • default is option 0 for serial/smpar, 1 for dmpar • smpar Shared Mem…

应对800G以太网挑战:数据中心迁移

在过去几年中&#xff0c;云基础设施和服务的大规模使用推动了对更多带宽、更快速度和更低延迟性能的需求。交换机和服务器技术的改进要求布线和架构随之调整。因此&#xff0c;800G以太网对数据中心迁移的需求&#xff0c;特别是对速率&#xff08;包括带宽、光纤密度和通道速…

YOLOv10(1):初探,训练自己的数据

目录 1. 写在前面 2. 值得关注的点 3. 训练自己的数据集 4. 阅读代码的小建议 1. 写在前面 很多人YOLOv9还没有完全研究透&#xff0c;YOLOv10出来了。 惊不惊喜&#xff0c;意不意外&#xff01; 据论文里提到&#xff0c;YOLOv10就是为了加速推理&#xff0c;在保证精度的…

C# NX二次开发-设置背景颜色

使用UF函数能直接设置UG背景颜色: 1.设置背景颜色选项为纯色: 2.编写更新背景颜色代码: var nxColor NXColor.Factory._Get(186);var rgb nxColor.GetRgb();double[] arr [rgb.R, rgb.G, rgb.B];theUf.Disp.SetColor(UFConstants.UF_DISP_BACKGROUND_COLOR, UFConstants.UF…

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…

Qt无边框

最简单的可拖动对话框(大小不可改变) #ifndef DIALOG_H #define DIALOG_H/*** file dialog.h* author lpl* brief 无边框dialog类* date 2024/06/05*/ #include <QDialog> #include <QMouseEvent> namespace Ui { class Dialog; } /*** brief The Dialog class* 无…

Shopee本土店成本利润如何核算?EasyBoss ERP帮您精准掌控

这几年做跨境电商的老板们都在说东南亚市场广阔&#xff0c;在东南亚开本土店流量大&#xff0c;为了赚钱兴冲冲跑去东南亚开本土店&#xff0c;每天看着店铺不停出单。 心里乐呵呵&#xff1a;“本土店是真赚钱&#xff0c;马上要走上人生巅峰了&#xff01;” 但每月实际一对…

PbootCms微信小程序官网模版/企业官网/社交电商官网/网络工作室/软件公司官网

在数字化时代&#xff0c;企业网站已成为吸引潜在客户、提升企业形象、和扩大品牌影响力的必备工具。因此&#xff0c;一个优秀的企业网站模板显得尤为重要。 企业官网的内容框架通常都包含企业形象、产品或服务类型、信息展示等部分&#xff0c;设计师需要借助和企业形象契合…

图片改大小的3个步骤,快速在线处理图片的方法

图片改大小是现在使用图片时经常要使用的一个功能&#xff0c;因为在很多的网上平台都会有对图片尺寸和图片大小的要求&#xff0c;只有符合平台要求的图片才可以正常上传使用。想要快速调整图片大小&#xff0c;可以在网上使用在线改图工具来处理&#xff0c;只需要简单的几步…

快速上手 ngrok:将你的本地服务一键暴露到互联网,开发者必备技能!

想让外界轻松访问你本地电脑上的项目&#xff1f;试试 ngrok 吧&#xff01;无论是调试 Web 应用&#xff0c;还是进行跨网络测试&#xff0c;ngrok 都能帮你一键创建安全隧道&#xff0c;将本地服务映射到公共 URL&#xff0c;让全球任何地方都能访问。本文详细介绍 ngrok 的安…

2.1.3 采用接口方式使用MyBatis

实战概述&#xff1a;使用MyBatis的接口方式进行数据库操作 环境准备 确保项目中已经集成了MyBatis框架。 创建用户映射器接口 在net.huawei.mybatis.mapper包中创建UserMapper接口。定义方法findById(int id)用于按编号查询用户。定义方法findAll()用于查询全部用户。定义方法…

Python 识别图片形式pdf的尝试(未解决)

想识别出pdf页面右下角某处的编号。pdf是图片形式页面。查了下方法&#xff0c;有源码是先将页面提取成jpg&#xff0c;再用pytesseract提取图片文件中的内容。 直接用图片来识别。纯数字的图片&#xff0c;如条形码&#xff0c;可识别。带中文的不可以&#xff0c;很乱。 识别…

jupyter之plt 画图弹出窗口展示图片以及静态图片切换方法

1. jupyter出图的三种方式 在python的Jupyter Notebook中&#xff0c;使用matplotlib绘制动态图形时&#xff0c;可能出现只显示一张静态图像。 这是因为在notebook中使用plt绘图共有三种模式&#xff1a; %matplotlib inline&#xff1a;这是默认的模式&#xff0c;输出的图片…

vscode ctrl+鼠标左键无法跳转

打开设置&#xff0c;搜索intel…… 将这个智能感知改成default就可以了&#xff0c;我之前是在disable处。 分析了一下&#xff0c;其实跳转功能主要是根据上下文语法分析来实现的&#xff0c;并不是简单得全文匹配&#xff0c;因此需要相关得语法分析工具。 那么为什么默认式…

异步时序逻辑电路分析

270页异步时序逻辑电路例题分析 阎石数电-第六章时序逻辑电路-6.2.3异步时序逻辑电路分析方法-例题6.2.4

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)---- xv6初探与实验一(Lab: Xv6 and Unix utilities)

系列文章目录 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&#xff09;----课程实验环境搭建&#x…

【文末附gpt升级秘笈】埃隆·马斯克芯片调配策略对特斯拉股价的影响分析

埃隆马斯克芯片调配策略对特斯拉股价的影响分析 一、引言 在现代商业环境中&#xff0c;企业间的资源调配与策略布局往往对其股价产生深远影响。据外媒CNBC报道&#xff0c;埃隆马斯克在芯片资源分配上的决策引起了业界的广泛关注。他秘密要求英伟达将原本预留给特斯拉的高端…

苹果Vision Pro 界面中英翻译

目录 菜单 &#x1f537;General&#x1f504;一般 AirDrop 隔空投送 Background App Refresh 后台应用刷新 Keyboards 键盘 VPN & Device Management VPN与设备管理​编辑Legal & Regulatory 法律法规 &#x1f537;Apps&#x1f504;应用程序 &#x1f537;Pe…

飞睿智能工业无线通信模块图传WiFi,地对空图传超5km,4堵实墙穿透稳定传输

在当今高科技飞速发展的时代&#xff0c;远距离无线通信技术的应用越来越广泛&#xff0c;尤其是在地对空通信领域。今天&#xff0c;我们将深入探讨一种远距离无线通信模块WiFi图传&#xff0c;它不仅能实现地对空远距离图传超过5公里&#xff0c;还具备穿透4堵实墙的穿墙效果…