Django之modelform使用
Django新增修改数据功能优化
目录
1.新增数据功能优化
2.修改数据功能优化
在我们做数据优化处理之前, 我们先回顾下传统的写法, 是如何实现增加修改的。
我们需要在templates里面新建前端的页面, 需要有新增还要删除, 比如说员工数据的新增, 那需要有很多个输入框, 那html结构里面, 都需要一一写入label, input, 选择框select里面配合option这样的组件。包括在后端写代码的时候, 在user.py那个views里面, 新增函数里面需要列出每一个字段并赋值, 就像以下代码:
name = request.POST.get("name") age = request.POST.get("age") gender = request.POST.get("gender") salary = request.POST.get("salary") dtime = request.POST.get("dtime") depart = request.POST.get("depart")
这样的写法, 会显得非常冗余, 代码质量不高, 这篇文章, 我们就是要解决这种问题的, 优化新增和修改功能, 使代码质量变得更高, 不出现冗余代码的情况(前端和后端代码需要达成的一致要求)。
还要一点就是传统的写法, 它没有数据校验功能。
那这篇文章, 我们要讲的是modelform, 它可以很好的解决我们上面所提到的一些问题。
一、新增数据功能优化
我们打开user.py, 编辑以下代码:
class userInfoModelForm(forms.ModelForm):name = forms.CharField(min_length=2, label="姓名")class Meta:model = models.UserInfo# 在UserInfo表给里面指定的字段可使用# fields = ["name", "gender"] # 代表可以用name和gender这两个字段# 所有的UserInfo表格的字段都使用fields = "__all__"# 相当于代替了之前的以下代码:#name = request.POST.get("name")# age = request.POST.get("age")# gender = request.POST.get("gender")# salary = request.POST.get("salary")# dtime = request.POST.get("dtime")# depart = request.POST.get("depart")# 如果是想要某张表格的某个字段不想用, 那就可以用exclude# exclude = ["create_time"]# 由于我们的userInfoModelForm类继承了forms.ModelForm类, 所以我们写构造函数的时候, 需要传入*args, **kwargs这两个参数def __init__(self, *args, **kwargs):super(userInfoModelForm, self).__init__(*args, **kwargs)# item是属性名, field是属性值for item, field in self.fields.items():# 给输入框input增加一个class属性field.widget.attrs.update({"class": "form-control"})
然后我们继续写添加函数在user.py里面:
def user_add_modelform(request):if request.method == "GET":title = "添加信息2.0版本"form = userInfoModelForm()return render(request, "user/user_modelform.html", {"title": title, "form": form})# 接受表单提交过来的数据form = userInfoModelForm(request.POST)# 校验数据是否完整if form.is_valid():# 存储到数据库form.save()return redirect("/user/")# 如果数据不完整,则返回当前添加页面,展示错误信息return render(request, "user/user_modelform.html", {"form": form})
这里我们需要创建一个userInfoModelForm对象。并将它传给前端。需要注意的是form = userInfoModelForm(request.POST)这行代码, 里面需要加request.POST, 这个是为了接受表单提交过来的数据, 提交表单数据, 就是用的POST方法。所以这里必须要加request.POST。
我们在templates里面的user文件夹里, 创建user_modelform.html:
{% extends "index/model_tmp.html" %}
{% load static %}{% block css %}<link rel="stylesheet" href="{% static 'css/layui.css' %}">
{% endblock %}{% block content %}<div class="container"><h1>{{ title }}</h1><form method="post">{% csrf_token %}{% for filed in form %}
{# filed.label这里面就是获取我们在models.py里面创建表格里面的每一个字段里面有个verbose_name这个参数的值 #}<label for="exampleInputEmail1">{{ filed.label }}</label>{{ filed }}{# 展示错误信息 #}<span style="color: red">{{ filed.errors.0 }}</span><br>{% endfor %}<button type="submit" class="btn btn-success">提交</button></form></div>
{% endblock %}{% block js %}<script src="{% static "js/layui.js" %}"></script><script>layui.use(function () {var laydate = layui.laydate;// 渲染laydate.render({// 这个id是员工入职时间的那个input输入框的id, 我们使用了modelform, 它会自动给我们每一个input都会生成一个id,// 格式为id_数据库字段名, 我们数据库员工表格里面的员工入职时间的那个字段是create_time, 所以id是id_create_time。elem: '#id_create_time'});});</script>
{% endblock %}
我们可以从代码中发现, 我们前端不用再一一的去写input, select那种输入框选择框了, filed就是input, 要展现label组件, 那就是filed.label, 如果提交表单之后有错误信息的话, 那就展示错误信息, 用filed.errors.0来展示, 还有, modelform它会帮我们每一个input输入框都会自动创建id, 就比如我们员工入职的时间那栏, id为id_create_time, 所以下面的script标签里面, 那个elem参数要写#id_create_time。
urls.py:
"""project_simple URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, userurlpatterns = [# path('admin/', admin.site.urls),path("", depart.index),path("depart/", depart.depart),path("depart/add/", depart.add_depart),path("depart/<int:nid>/modify/", depart.depart_modify),path("depart/<int:nid>/del/", depart.del_depart),path("user/", user.user_info),path("user/add/", user.user_add),path("user/<int:nid>/modify/", user.user_modify),path("user/<int:nid>/del/", user.user_del),# 使用modelform来解决新增path("user/add/modelform", user.user_add_modelform)
]
完善user_list.html:
{% extends "index/model_tmp.html" %}{% block content %}<div class="container"><a href="/user/add/" class="btn btn-success">添加信息</a>{# 这个是优化过的新增功能 #}<a href="/user/add/modelform" class="btn btn-warning">添加信息</a><div class="panel panel-danger"><div class="panel-heading"><h3 class="panel-title">部门表</h3></div><div class="panel-body"><table class="table table-hover"><thead><tr><th>ID</th><th>姓名</th><th>性别</th><th>薪水</th><th>年龄</th><th>入职时间</th><th>部门</th></tr></thead><tbody>{% for data in user_list %}<tr><th scope="row">{{ data.id }}</th><td>{{ data.name }}</td><td>{{ data.get_gender_display }}</td><td>{{ data.salary }}</td><td>{{ data.age }}</td><td>{{ data.create_time|date:"Y-m-d" }}</td><td>{{ data.department.title }}</td><td style="color: green"><a href="/user/{{ data.id }}/modify/"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a><a href="/user/{{ data.id }}/del/"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a></td></tr>{% endfor %}</tbody></table></div></div></div>
{% endblock %}
运行结果:
点击右边黄色按钮的添加信息
由此可见, 我们成功的添加了数据。
二、修改数据功能优化
修改功能, 和刚才那个新增功能, 有异曲同工之妙, 但也有天壤之别。
我们同样的打开user.py:
def user_modify_modelform(request, nid):# 获取要修改的那行数据obj = models.UserInfo.objects.filter(id=nid).first()if request.method == "GET":title = "修改信息2.0版本"# 这个代码的作用是当我们进入user_modelform.html界面的时候, 所有的输入框都会出现需要修改数据中的每一个字段内容里面的文字form = userInfoModelForm(instance=obj)return render(request, "user/user_modelform.html", {"title": title, "form": form})# 接受表单提交过来的数据form = userInfoModelForm(request.POST, instance=obj)# 校验数据是否完整if form.is_valid():# 存储到数据库form.save()return redirect("/user/")# 如果数据不完整,则返回当前修改页面,展示错误信息return render(request, "user/user_modelform.html", {"form": form})
这里面多了个obj = models.UserInfo.objects.filter(id=nid).first()这行代码, 因为我们修改某一行数据的时候, 需要先获取要修改的那行的所有数据, 并且展示到每一个输入框里面, 这样我们在做修改的时候, 才知道我们需要修改哪一行数据, 避免混淆。还有, 就是在创建userInfoModelForm对象的时候, 里面要传入instance参数, instance要传入的值就是我们获取到要修改的那行数据。其他的写法, 都和上面的新增数据一样。
这里面, 我们新增数据和修改数据, 都是用的同一个html文件, 都是user_modelform.html, 我们把它作为了新增和修改的公用页面。
urls.py:
"""project_simple URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, userurlpatterns = [# path('admin/', admin.site.urls),path("", depart.index),path("depart/", depart.depart),path("depart/add/", depart.add_depart),path("depart/<int:nid>/modify/", depart.depart_modify),path("depart/<int:nid>/del/", depart.del_depart),path("user/", user.user_info),path("user/add/", user.user_add),path("user/<int:nid>/modify/", user.user_modify),path("user/<int:nid>/del/", user.user_del),path("user/add/modelform", user.user_add_modelform),path("user/<int:nid>/modify/modelform", user.user_modify_modelform)
]
完善user_list.html:
{% extends "index/model_tmp.html" %}{% block content %}<div class="container"><a href="/user/add/" class="btn btn-success">添加信息</a>{# 这个是优化过的新增功能 #}<a href="/user/add/modelform" class="btn btn-warning">添加信息</a><div class="panel panel-danger"><div class="panel-heading"><h3 class="panel-title">部门表</h3></div><div class="panel-body"><table class="table table-hover"><thead><tr><th>ID</th><th>姓名</th><th>性别</th><th>薪水</th><th>年龄</th><th>入职时间</th><th>部门</th></tr></thead><tbody>{% for data in user_list %}<tr><th scope="row">{{ data.id }}</th><td>{{ data.name }}</td><td>{{ data.get_gender_display }}</td><td>{{ data.salary }}</td><td>{{ data.age }}</td><td>{{ data.create_time|date:"Y-m-d" }}</td><td>{{ data.department.title }}</td><td style="color: green">{# 我们这里使用modelform来完成修改操作 #}<a href="/user/{{ data.id }}/modify/modelform"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a><a href="/user/{{ data.id }}/del/"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a></td></tr>{% endfor %}</tbody></table></div></div></div>
{% endblock %}
user.py完整代码(包含之前写过的所有内容):
from django.shortcuts import render, redirect
from django import formsfrom project_one import models# Create your views here.
def user_info(request):user_list = models.UserInfo.objects.all()return render(request, "user/user_list.html", {"user_list": user_list})def user_add(request):if request.method == "GET":content = {"gender_choices": models.UserInfo.gender_choices,"depart_list": models.Department.objects.all()}return render(request, "user/user_add.html", content)name = request.POST.get("name")age = request.POST.get("age")gender = request.POST.get("gender")salary = request.POST.get("salary")dtime = request.POST.get("dtime")depart = request.POST.get("depart")models.UserInfo.objects.create(name=name, gender=gender, salary=salary, age=age, create_time=dtime,department_id=depart)return redirect("/user/")def user_modify(request, nid):if request.method == "GET":data = models.UserInfo.objects.filter(id=nid).first()content = {"gender_choices": models.UserInfo.gender_choices,"depart_list": models.Department.objects.all()}return render(request, "user/user_modify.html", {"content": content, "data": data})name = request.POST.get("name")age = request.POST.get("age")gender = request.POST.get("gender")salary = request.POST.get("salary")dtime = request.POST.get("dtime")depart = request.POST.get("depart")models.UserInfo.objects.filter(id=nid).update(name=name, gender=gender, salary=salary, age=age, create_time=dtime,department_id=depart)return redirect("/user/")def user_del(request, nid):models.UserInfo.objects.filter(id=nid).delete()return redirect("/user/")class userInfoModelForm(forms.ModelForm):name = forms.CharField(min_length=2, label="姓名")class Meta:model = models.UserInfo# 所以的UserInfo表格的字段都使用fields = "__all__"# 如果是想要某张表格的某个字段不想用, 那就可以用exclude# exclude = ["create_time"]# 由于我们的userInfoModelForm类继承了forms.ModelForm类, 所以我们写构造函数的时候, 需要传入*args, **kwargs这两个参数def __init__(self, *args, **kwargs):super(userInfoModelForm, self).__init__(*args, **kwargs)# item是属性名, field是属性值for item, field in self.fields.items():# 给输入框input增加一个class属性field.widget.attrs.update({"class": "form-control"})def user_add_modelform(request):if request.method == "GET":title = "添加信息2.0版本"form = userInfoModelForm()return render(request, "user/user_modelform.html", {"title": title, "form": form})# 接受表单提交过来的数据form = userInfoModelForm(request.POST)# 校验数据是否完整if form.is_valid():# 存储到数据库form.save()return redirect("/user/")# 如果数据不完整,则返回当前添加页面,展示错误信息return render(request, "user/user_modelform.html", {"form": form})def user_modify_modelform(request, nid):# 获取要修改数据的那行数据obj = models.UserInfo.objects.filter(id=nid).first()if request.method == "GET":title = "修改信息2.0版本"# 这个代码的作用是当我们进入user_modelform.html界面的时候, 所有的输入框都会出现需要修改数据中的每一个字段内容里面的文字form = userInfoModelForm(instance=obj)return render(request, "user/user_modelform.html", {"title": title, "form": form})# 接受表单提交过来的数据form = userInfoModelForm(request.POST, instance=obj)# 校验数据是否完整if form.is_valid():# 存储到数据库form.save()return redirect("/user/")# 如果数据不完整,则返回当前修改页面,展示错误信息return render(request, "user/user_modelform.html", {"form": form})
运行结果:
比如说, 我们修改第二行数据:
我们发现, 数据修改成功了。
好了, 这篇文章关于优化新增和修改功能的内容, 就到此为止了。
以上就是Django新增修改数据功能优化的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!
相关文章:
Django之modelform使用
Django新增修改数据功能优化 目录 1.新增数据功能优化 2.修改数据功能优化 在我们做数据优化处理之前, 我们先回顾下传统的写法, 是如何实现增加修改的。 我们需要在templates里面新建前端的页面, 需要有新增还要删除, 比如说员工数据的新增, 那需要有很多个输入框, 那html…...
Hadoop:大数据时代的基石
在当今数字化浪潮中,数据量呈爆炸式增长,企业和组织面临着前所未有的数据处理挑战。从社交媒体的海量信息到物联网设备的实时数据,如何高效地存储、管理和分析这些数据成为了一个关键问题。Apache Hadoop 作为大数据处理领域的核心框架&#…...
定制开发还是源码搭建?如何快速上线同城外卖跑腿APP?
在“万物皆可同城配送”的时代,同城外卖跑腿APP成为众多创业者和本地服务商的热门选择。无论是打造本地生活服务平台,还是拓展快送业务,拥有一款功能完善、体验流畅的外卖跑腿APP,已经成为进入市场的标配。 然而,对于…...
How AI could empower any business - Andrew Ng
How AI could empower any business - Andrew Ng References 人工智能如何为任何业务提供支持 empower /ɪmˈpaʊə(r)/ vt. 授权;给 (某人) ...的权力;使控制局势;增加 (某人的) 自主权When I think about the rise of AI, I’m reminded …...
SpringBoot-基础特性
1.SpringApplication 1.1.自定义banner 类路径添加banner.txt或设置spring.banner.location就可以定制 banner 1.2.自定义 SpringApplication import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.bo…...
系统环境变量有什么实际作用,为什么要配置它
系统环境变量有什么实际作用,为什么要配置它 系统环境变量具有以下重要实际作用: 指定程序路径:操作系统通过环境变量来知晓可执行文件、库文件等的存储位置例如,当你在命令提示符或终端中输入一个命令时,系统会根据环境变量PATH中指定的路径去查找对应的可执行文件。如果…...
C++ | STL之list详解:双向链表的灵活操作与高效实践
引言 std::list 是C STL中基于双向链表实现的顺序容器,擅长高效插入和删除操作,尤其适用于频繁修改中间元素的场景。与std::vector不同,std::list的内存非连续,但提供了稳定的迭代器和灵活的元素管理。本文将全面解析std::list的…...
Spring Cloud 服务间调用深度解析
前言 在构建微服务架构时,服务间的高效通信是至关重要的。Spring Cloud 提供了一套完整的解决方案来实现服务间的调用、负载均衡、服务发现等功能。本文将深入探讨 Spring Cloud 中服务之间的调用机制,并通过源码片段和 Mermaid 图表帮助读者更好地理解…...
什么是时间复杂度和空间复杂度?
什么是时间复杂度和空间复杂度? 时间复杂度:衡量代码运行时间随输入规模增大而增长的速度。简单来说,就是“代码跑多快”。 空间复杂度:衡量代码运行时额外占用的内存空间随输入规模增大而增长的速度。简单来说,就是“代码用多少内存”。 我们通常用 大 O 表示法(Big O N…...
算法思想之分治-快排
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之分治-快排 发布时间:2025.4.15 隶属专栏:算法 目录 算法介绍核心步骤优化策略 例题颜色分类题目链接题目描述算法思路代码实现 排序数组题目链接题目描述算法思路代码实现 数组中的…...
25.4.15学习总结
问题: 邮箱验证码通过公钥加密后发到前端,在前端用私钥解密验证可行吗? 结论: 在前端使用私钥解密通过公钥加密的邮箱验证码在技术上是可行的,但存在严重的安全风险,不建议采用。 问题分析 非对称加密的…...
小程序获取用户总结(全)
获取方式 目前小程序获取用户一共有3中(自己接触到的),但由于这个API一直在改,所以不确定后期是否有变动,还是要多关注官方公告。 方式一 使用wx.getUserInfo 实例: wxml 文件<button open-type="getUserInfo" bindgetuserinfo="onGetUserInfo&quo…...
如何成为一名嵌入式软件工程师?
如何成为一名嵌入式软件工程师? 01明确岗位的角色与定位 嵌入式软件工程师主要负责开发运行在特定硬件平台上的软件,这些软件通常与硬件紧密集成,以实现特定的功能。 不仅需要精通编程语言(如C/C、Java等)和软件开发工…...
机器人发展未来两年会有突破吗?
未来两年,机器人技术将在芯片、编码器、材料、加工工艺和AI等核心领域迎来系统性突破,推动行业从专用化向通用化转型。以下从技术路径、产业动态和商业化前景三个维度展开分析,结合权威数据与技术趋势,构建机器人技术演进的全景框架。 一、芯片技术:3nm制程与存算一体架构…...
【grafana原生告警中心配置飞书机器人告警】
在grafana中的connect point中使用webhook的方式推送到飞书,始终无法触发告警,原因是grafana推送的格式飞书不识别,现有两种方式 1.使用中转服务 使用flask搭建一个服务,grafana告警先通过webhook发送到web服务中,格…...
HTTP HTTPS RSA
推荐阅读 小林coding HTTP篇 文章目录 HTTP 80HTTP 响应码1xx:信息性状态码(Informational)2xx:成功状态码(Success)3xx:重定向状态码(Redirection)4xx:客户端…...
【机器学习】如何正确下载sklearn包
TOC 直接pip install sklearn时,报错 sklearn的包,实际上叫scikit-learn pip install scikit-learn发现成功了: 总结 下载sklearn包的语句:pip install scikit-learn 完成。...
【Python进阶】断言(assert)的十大核心应用场景解析
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现(10个案例)案例1:参数合法性检查案例2:不变…...
关于汽车辅助驾驶不同等级、技术对比、传感器差异及未来发展方向的详细分析
以下是关于汽车辅助驾驶不同等级、技术对比、传感器差异及未来发展方向的详细分析: 一、汽车辅助驾驶等级详解 根据SAE(国际自动机工程师学会)的标准,自动驾驶分为 L0到L5 六个等级: 1. L0(无自动化&…...
STM32 HAL库之WDG示例代码
独立看门狗(IWDG) 初始化独立看门狗,在main.c中的 MX_IWDG_Init();,也就是iwdg.c中的初始化代码 void MX_IWDG_Init(void) {/* USER CODE BEGIN IWDG_Init 0 *//* USER CODE END IWDG_Init 0 *//* USER CODE BEGIN IWDG_Init 1 …...
【差分隐私相关概念】瑞丽差分隐私(RDP)命题10
命题10证明中的最后一个不等号成立,关键在于将事件 A A A上的积分与Rnyi散度 D α ( P ∥ Q ) D_\alpha(P \parallel Q) Dα(P∥Q)的定义联系起来,并通过积分放缩得到上界。具体推导如下: Rnyi散度的定义: D α ( P ∥ Q ) 1 …...
Android 开发 如何生成系统签名
在源码中拿到安全文件 文件路径 lagvm/LINUX/android/build/target/product/security如下两个文件 platform.pk8 platform.x509.pem 使用Android studio生成一个jks Android studio 顶部 buildGenerate Signed Bundle or APKapkcrate new记住 记住alias 和password linux下…...
(EtherCAT 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
型号 协议转换通信网关 EtherCAT 转 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关,为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案,可以轻松容易将 EtherNet/IP 网络接入 EtherCAT 网络中,方便…...
适合stm32 前端adc使用的放大器芯片
在 STM32 前端 ADC 应用中,合适的放大器芯片需具备低噪声、高精度、低失调电压等特性。以下为你推荐几款常用的放大器芯片: 低功耗、高精度型 OPA2333 特点:这是一款微功耗、零漂移运算放大器,失调电压极低,仅为 2.5…...
《Ethical Implications of ChatGPT in Higher Education: A Scoping Review》全文翻译
《Ethical Implications of ChatGPT in Higher Education: A Scoping Review》 ChatGPT在高等教育中的伦理影响:一项范围界定性综述 摘要 本范围界定性综述探讨了在高等教育中使用ChatGPT所引发的伦理挑战。通过回顾近期发表的英文、中文和日文的学术文章&#x…...
day26 学习笔记
文章目录 前言一、边缘填充1.边界复制2.边界反射3.边界常数4.边界包裹5.代码示例 二、透视变换三、颜色加法 前言 通过今天的学习,我掌握了OpenCV中有关边缘填充,透视变换以及颜色加法的相关概念和操作 一、边缘填充 当我们对图像进行仿射变换后往往会发…...
LVGL Animation Image(Animimg)控件详解
一、Animation Image(Animimg)控件详解 1. 概述 功能:Animimg 是 LVGL 中用于显示动画图像的控件。特点:支持从多个静态图像创建动画效果。 2. 创建和初始化 创建方法:lv_obj_t * lv_animimg_create(lv_obj_t * pa…...
【unity游戏开发入门到精通——UGUI】GraphicRaycaster图形射线投射器组件
注意:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——UGUI】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言Graphic Raycaster参数1、Ignore Reversed Graphics:是否忽略反…...
WPF GDI 画 晶圆Mapping图
效果图 UI代码 <Window x:Class="WpfWaferMapping.Window3"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expre…...
AI核心概念之“提示(Prompt)” - 来自DeepSeek
1. 表层理解:Prompt 是用户输入的文本指令 直观表现: 对于普通用户,Prompt 是输入到对话框的文本(例如 ChatGPT 中的问题:“写一首关于秋天的诗”),点击发送后,模型返回结果。 常见…...
Golang|Kafka在秒杀场景中的应用
我们的程序在面对 kill -9 这样的指令的时候会直接退出,不能保证数据持久化到mysql完后再退出而且我们现在的并发量仍然不够,只能加机器,多机器并发写mysql可能导致mysql扛不住,mysql写的并发量不能根据我们机器的数量的增长而增长…...
【前端基础】--- HTML
个人主页 : 9ilk 专栏 : 前端基础 文章目录 🏠 初识HTML🏠 HTML结构认识HTML标签HTML文件基本结构标签层次结构快速生成代码框架 🏠 HTML常见标签注释标签标题标签 h1-h6段落标签 p换行标签 br格式化标签图片标签 img超链接标签…...
各证券公司QMT的本地VSCode开发环境配置指南
各证券公司QMT变种的本地开发环境配置指南 各大证券公司的量化交易平台(如兴业证券的SMT-Q)基本都是基于QMT开发的变种系统,它们的底层架构相似,但在接口和功能上可能有所差异。下面介绍如何使用本地Python、Anaconda和VSCode搭建…...
注意力机制的改进
Transformer架构中的注意力机制优化是提升模型效率和扩展处理长序列能力的关键。以下从多个维度详细解析注意力机制的优化方法: arXIv论文链接 1. 稀疏注意力(Sparse Attention) 通过限制每个位置仅关注特定区域,减少计算量&am…...
Golang|select
文章目录 多路监听超时控制 多路监听 如果selcet外面没有for循环,则只会监听一次,要实现一直监听的话要加for循环但是如果要设置退出条件的话,break语句只会退出这个select而不会退出for循环 select也可以有default,用于不用等cha…...
网络安全与信息安全的区别及共通
在数字化时代,网络安全与信息安全已成为保障个人、企业乃至国家正常运转的重要防线。尽管二者紧密相关且常被混为一谈,但实则存在显著差异。当然,它们也有一些相同点,比如都以保障数字环境下的安全为核心目标,均需要通…...
【刷题2025】知识点梳理
1.常用操作 二进制异或 ans = a ^ b 向上取整 math.ceil(a/b) 向下取整 math.floor(a/b) 每次取最低字节:一个字节八位 while a > 0:aSum += a & 0xff # 累加最低字节的大小a >>= 8 # 一个字节八位, a右移八位, 将最低字节移除 正则匹配 # 编译正则表达式…...
# 从零开发小红书风格Flutter应用:图片上传功能实现踩坑记录
从零开发小红书风格Flutter应用:图片上传功能实现踩坑记录 作为第一次开发完整Flutter应用的经历,我在实现类似小红书的图片上传功能时遇到了不少挑战。本文将完整记录整个开发过程,包括技术选型、实现细节和遇到的问题。 技术栈选择 前端…...
Android studio配置Flutter遇到的问题总结
1、Android studio 安装cmdline-tools后 ,cmd里运行flutter doctor,依旧报错 如何处理: 先执行: flutter config --android-sdk "E:\sdk\Sdk(SDK路径)" 再执行:flutter doctor --android-licen…...
__progname宏的用途(摘自DeepSeek)
__progname 宏解析 __progname 是一个在许多 Unix-like 系统中用于获取当前程序名称的宏或全局变量,主要用于错误报告、日志记录等场景。 基本定义 __progname 通常定义在标准库或系统头文件中 使用方法 基本用法 #include <stdio.h> #include <stdl…...
AI agents系列之智能体框架介绍
1. 引言 智能体AI Agents框架通过赋予自主系统动态感知、推理和行动的能力,彻底改变了AI领域。本节将探讨智能体框架的核心概念,并重点介绍为什么开源解决方案对现代AI开发的创新和可扩展性至关重要。 1.1 什么是智能体框架? 智能体框架代…...
(2025-04-12)向老主机箱中安装新买的显卡及固态硬盘
目录 1 引言2 显卡及其驱动的安装3 固态硬盘的安装及C盘扩容3.1 固态硬盘正确连接到主板上后,操作系统上面仍然不显示对应盘符怎么办?3.2 如何对C盘扩容?3.3 新问题:原有D盘程序不能运行 4 总结 1 引言 今天安装昨天买的新固态硬…...
从 Spring Boot 到 Django —— 后端开发技术类比学习
从 Spring Boot 到 Django —— 后端开发技术类比学习 引言(从javaweb到pythonweb) Django,一个成熟而简洁的 Web 框架时,我们在学习这个框架的过程中不仅可以体验 Python 的便捷生态,更能发现 Django 与 Spring Boo…...
外接键盘与笔记本命令键键位不同解决方案(MacOS)
文章目录 修改键位第一步:打开设置第二步:进入键盘快捷键第三步:修改修饰键设置第四步:调整键位第五步:保存设置tips ikbc c87键盘win键盘没反应的解决亲测的方法这是百度的答案标题常规组合键尝试:型号差…...
测试基础笔记第四天(html)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签(变形金刚)form标签列表标签 htm…...
爱普生SG2520VGN差分晶振5G基站的时钟解决方案
在 5G 通信时代,数据流量呈爆发式增长,5G 基站作为信号的核心中转枢纽,承载着前所未有的数据传输与处理重任。从海量的物联网设备连接,到高速移动用户的数据交互,每一个环节都对基站的性能提出了严苛要求。而精准稳定的…...
广汽滴滴Robotaxi首次亮相,中国自动驾驶加速领跑新赛道
作者 |张马也 编辑 |德新 4月12日,在广汽科技日上,广汽与滴滴合作的前装量产Robotaxi首次正式亮相。 这款车基于广汽埃安的纯电平台打造,搭载了滴滴自动驾驶的全套软硬件方案。滴滴自动驾驶全新一代的硬件平台, 包含激光雷达、…...
从拥堵到畅行,智慧城市如何实现交通魔法?
实时交通监控与数据分析 在智慧城市的建设中,实时交通监控是基础。它依赖于广泛部署的传感器网络,如摄像头、雷达、地磁感应器等,用于收集道路交通信息。这些设备将数据传输至中央管理系统,利用大数据处理技术进行分析࿰…...
边缘计算场景下的模型轻量化:TensorRT部署YOLOv7的端到端优化指南
一、边缘计算场景下的技术挑战与优化路径 在边缘设备(如Jetson系列)部署YOLOv7需兼顾模型精度、推理速度与功耗限制三重约束。TensorRT作为NVIDIA官方推理加速库,通过算子融合、量化压缩和内存复用等优化技术,可将模型推理速度提…...
flutter json解析增强
依赖:xxf_json 反序列化兼容特征一览表 类型\是否兼容 int double num string bool int yes yes yes yes yes double yes yes yes yes yes num yes yes yes yes yes string yes yes yes yes yes bool yes yes yes yes yes 专业词语 .g…...