10 django管理系统 - 管理员管理 - 新建管理员(通过模态框和ajax实现)
在文章“04 django管理系统 - 部门管理 - 新增部门”中,我们通过传统的新增页面来实现部门的添加。
在本文中,我们通过模态框和ajax来实现管理员的新增。
首先在admin_list.html中新建入口,使用按钮
<div class="panel-heading"><input type="button" class="btn btn-primary" value="新建管理员">
</div>
效果如下:
我们希望点击【新建管理员】的时候,跳一个弹框出来。我们从bootstrap官网随便扒拉一个模态框例子即可。
那么就需要给按钮设置data-toggle和data-target属性以及id
<div style="margin-bottom: 18px"><input type="button" class="btn btn-primary" value="新建管理员" data-toggle="modal"data-target="#myModal" id="btn_add">
</div>
同时,要给即将弹出的框子赋予同样的属性
<div>
<!-- 新建订单弹框 --><div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"aria-label="Close"><spanaria-hidden="true">×</span></button><h4 class="modal-title" id="myModalLabel">我是被弹出来的对话框</h4></div><div class="modal-body">我是弹出来的内容1我是弹出来的内容2我是弹出来的内容3我是弹出来的内容4</div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button><button type="button" class="btn btn-primary">Save changes</button></div></div></div></div>
</div>
效果如下:
接下来就需要绑定点击事件了。
{% block js %}<script>// 绑定btn_add的点击事件$(function () {bingBtnAddEvent();})function bingBtnAddEvent() {$("#btn_add").click(function () {// 点击新建管理员,弹出模态框console.log("click btn_add");})}</script>
{% endblock %}
效果如下:
接着,就需要把表单填入弹框。
我们回到admin.py中,编辑业务逻辑
我们首先创建管理员的ModelForm
class AdminModelForm(BootStrapModelForm):class Meta:model = models.Adminfields = "__all__"
接着去修改业务逻辑,看看能不能在前端接收到这个表格内容
1 我们创建form对象,并且传递到前端界面
def admin_list(request):# return HttpResponse("admin_list is ok")# 查询所有的数据queryset = models.Admin.objects.using("default").all()form = AdminModelForm()context = {"queryset": queryset,"form": form}return render(request, 'admin_list.html', context)
2 我们在前端界面接收一下
<div><!-- 新建订单弹框 --><div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"aria-label="Close"><spanaria-hidden="true">×</span></button><h4 class="modal-title" id="myModalLabel">我是被弹出来的对话框</h4></div><div class="modal-body">{{ form }}</div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button><button type="button" class="btn btn-primary">Save changes</button></div></div></div></div>
</div>
就是我箭头指向的部分
效果如下:
为了后面方便操作表单以及美化界面,我们把这个div装饰一下,给个id
<div class="modal-body"><form id="formAdd"><div class="clearfix">{% for field in form %}<div class="col-xs-12"><div class="form-group"style="position: relative;margin-bottom: 20px;"><label>{{ field.label }}</label>{{ field }}<span class="error-msg"style="color: red;position: absolute;"></span></div></div>{% endfor %}</div></form>
</div>
效果如下:
我们把标题和按钮的名称都改一下
<!-- 新建订单弹框 -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"aria-label="Close"><spanaria-hidden="true">×</span></button><h4 class="modal-title" id="myModalLabel">新建管理员</h4></div><div class="modal-body"><form id="formAdd"><div class="clearfix">{% for field in form %}<div class="col-xs-12"><div class="form-group"style="position: relative;margin-bottom: 20px;"><label>{{ field.label }}</label>{{ field }}<span class="error-msg"style="color: red;position: absolute;"></span></div></div>{% endfor %}</div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取消</button><button type="button" class="btn btn-primary">保存</button></div></div></div>
</div>
ok,现在,显示界面就出来了,接下来的工作就是,当用户点击保存的时候,就把表单中的数据插入到数据库中去。
首先就是要分配id:btn_save
<div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取消</button><button type="button" class="btn btn-primary" id="btn_save">保存</button>
</div>
接着就是去绑定点击事件
<script>// 绑定btn_add的点击事件$(function () {// 新增按钮的点击事件bingBtnAddEvent();// 保存按钮的点击事件bindBtnSaveEvent();})function bingBtnAddEvent() {$("#btn_add").click(function () {// 点击新建管理员,弹出模态框console.log("click btn_add");})}function bindBtnSaveEvent() {$("#btn_save").click(function () {alert("btn_save clicked! 我被点击拉")})}
</script>
效果如下:
ok,可以看到,确实是点击成功了。
那么,接下来,我们就需要使用ajax悄咪咪的发送数据给后台
function bindBtnSaveEvent() {$("#btn_save").click(function () {{#alert("btn_save clicked! 我被点击拉")#}// 下面是ajax提交表单数据,提交到后台// 首先是批量获取表单数据let formData = $("#formAdd").serialize();console.log(formData);})
}
可以看到确实有数据被console.log出来
接着就是发送请求了。
function bindBtnSaveEvent() {$("#btn_save").click(function () {{#alert("btn_save clicked! 我被点击拉")#}// 下面是ajax提交表单数据,提交到后台// 首先是批量获取表单数据let formData = $("#formAdd").serialize();console.log(formData);// 发送ajax请求$.ajax({url: "/admin/add/",type: "post",data: formData,success: function (data) {console.log(data);}})})
}
然后去配置url路径: url: "/admin/add/"
urlpatterns = [# 部门管理path("dept/list/", dept.dept_list),path("dept/add/", dept.dept_add),path("dept/<int:nid>/edit_detail/", dept.dept_editdetail),path("dept/<int:nid>/delete/", dept.dept_delete),path("dept/search/", dept.dept_search),# 管理员管理path("admin/list/", admin.admin_list),path("admin/add/", admin.admin_add),]
去admin.py里去定义函数admin_add()
def admin_add(request):pass
因为ajax发送的是post请求,所以我们要免除csrf认证
@csrf_exempt
def admin_add(request):pass
接下来就是数据校验部分了
@csrf_exempt
def admin_add(request):"""处理管理员添加请求,该函数主要用于接收POST请求数据,并使用AdminModelForm进行数据验证和保存。通过Ajax方式提交请求时,服务器需要返回JsonResponse以提供异步处理结果。参数:- request: HttpRequest对象,包含了请求的相关信息,如POST数据。返回:- 若表单验证成功,返回包含'status': True的JsonResponse,表示添加成功。- 若表单验证失败,返回包含'status': False和错误信息的JsonResponse,表示添加失败。"""# 首先获取数据form = AdminModelForm(request.POST)if form.is_valid(): # 如果验证成功form.save()return JsonResponse({'status': 'True'})return JsonResponse({ # 如果验证失败'status': 'False','error': form.errors})
现在我们去前端ajax的success里面去看看
function bindBtnSaveEvent() {$("#btn_save").click(function () {{#alert("btn_save clicked! 我被点击拉")#}// 下面是ajax提交表单数据,提交到后台// 首先是批量获取表单数据let formData = $("#formAdd").serialize();console.log(formData);// 发送ajax请求$.ajax({url: "/admin/add/",type: "post",data: formData,success: function (data) {console.log(data,"我从admin_add函数成功返回");}})})
}
可以看到,被接收成功了
接着,我们去编写接收成功后的业务逻辑,添加成功后,自动刷新界面
function bindBtnSaveEvent() {$("#btn_save").click(function () {{#alert("btn_save clicked! 我被点击拉")#}// 下面是ajax提交表单数据,提交到后台// 首先是批量获取表单数据let formData = $("#formAdd").serialize();console.log(formData);// 发送ajax请求$.ajax({url: "/admin/add/",type: "post",data: formData,dataType: "json",success: function (data) {console.log(data, "我从admin_add函数成功返回");if (data.status === "True") {alert("添加成功!")window.location.reload();} else {alert("添加失败!")}}})})
}
我们来看看添加失败的情况
1 假设,我什么都不填,我看看啥情况
可以看到状态status的值是false,同时提示添加失败。
2 假设,我填写部分,我看看啥情况
可以看到,填写部分或者不填,是会弹窗的。
但是我们应该在界面上提示用户。ok,所以我们修改界面逻辑。
首先我们看看定位:
我们可以看到,输入框都是由id开头的,拼接字段。
既然如此,那么我们就遍历拼接。
function bindBtnSaveEvent() {$("#btn_save").click(function () {{#alert("btn_save clicked! 我被点击拉")#}// 下面是ajax提交表单数据,提交到后台// 首先是批量获取表单数据let formData = $("#formAdd").serialize();console.log(formData);// 发送ajax请求$.ajax({url: "/admin/add/",type: "post",data: formData,dataType: "json",success: function (data) {console.log(data, "我从admin_add函数成功返回");if (data.status === "True") {alert("添加成功!")window.location.reload();} else {alert("添加失败!")// 在弹出框中显示错误信息console.log(data.error);// 把错误信息显示在模态框中$.each(data.error, function (name, error_list) { // name就是字段名,error_list就是错误信息列表// 根据字段名字,找到对应的input标签,然后显示错误信息$("#id_" + name).next().text(error_list[0]);})}}})})
}
在form表单中,添加span
<form id="formAdd"><div class="clearfix">{% for field in form %}<div class="col-xs-12"><div class="form-group"style="position: relative;margin-bottom: 20px;"><label>{{ field.label }}</label>{{ field }}<span class="error-msg"style="color: red;position: absolute;"></span></div></div>{% endfor %}</div>
</form>
效果如下:
并且,我们要在每次点击之前,先把错误信息清空。
function bindBtnSaveEvent() {// 点击之前,清除错误信息$(".error-msg").empty()$("#btn_save").click(function () {{#alert("btn_save clicked! 我被点击拉")#}// 下面是ajax提交表单数据,提交到后台// 首先是批量获取表单数据let formData = $("#formAdd").serialize();console.log(formData);// 发送ajax请求$.ajax({url: "/admin/add/",type: "post",data: formData,dataType: "json",success: function (data) {console.log(data, "我从admin_add函数成功返回");if (data.status === "True") {alert("添加成功!")window.location.reload();} else {alert("添加失败!")// 在弹出框中显示错误信息console.log(data.error);// 把错误信息显示在模态框中$.each(data.error, function (name, error_list) { // name就是字段名,error_list就是错误信息列表// 根据字段名字,找到对应的input标签,然后显示错误信息$("#id_" + name).next().text(error_list[0]);})}}})})
}
自此,我们完成了添加管理员,并且是通过弹框以及ajax发送请求完成的添加。
相关文章:

10 django管理系统 - 管理员管理 - 新建管理员(通过模态框和ajax实现)
在文章“04 django管理系统 - 部门管理 - 新增部门”中,我们通过传统的新增页面来实现部门的添加。 在本文中,我们通过模态框和ajax来实现管理员的新增。 首先在admin_list.html中新建入口,使用按钮 <div class"panel-heading&quo…...
Mysql中表字段VARCHAR(N)类型及长度的解释
本文将针对MySQL 中 varchar (N)类型字段的存储方式进行解释,主要是对字符和字节的关系的理解。 1. varchar (N) 中的 N varchar (N) 中的 N 表示字符数,而不是字节数。这意味着 N 表示你可以存储多少个字符。 字符数:指的是字符的个数&…...
git提交信息写错处理方式
在Git中,你可以通过使用rebase命令来合并提交记录。以下是一个简单的步骤来合并一系列提交: 使用git rebase -i开始交互式变基。在打开的编辑器中,你会看到一个提交列表。若要合并提交,将要合并的提交前面的pick改为squash或s。保…...

C#从零开始学习(用unity探索C#)(unity Lab1)
初次使用Unity 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp Unity的下载与安装 从 unity官网下载Unity Hub Unity的使用 安装后,注册账号,下载unity版本,然后创建3d项目 设置窗口界面布局 3D对象的创建 点击对象,然后点击Move Guzmo,就可以拖动…...

【SpringBoot】15 Echarts+Thymeleaf 绘制各种图表
Gitee仓库 https://gitee.com/Lin_DH/system 介绍 ECharts是百度开源的一个前端组件。它是一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,…...

网络学习笔记
一、网络的结构与功能 网络的鲁棒性与抗毁性 如果在移走少量节点后网络中的绝大部分节点仍然是连通的,那么就该网络的连通性对节点故障具有鲁棒性 网络上的动力学 动力系统:自旋、振子或混沌的同步、可激发系统 传播过程:信息传播与拥堵…...

[论文笔记]HERMES 3 TECHNICAL REPORT
引言 今天带来论文HERMES 3 TECHNICAL REPORT,这篇论文提出了一个强大的工具调用模型,包含了训练方案介绍。同时提出了一个函数调用标准。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 聊天模…...

MySQL-19.多表设计-一对多-外键
一.多表问题分析 二.添加外键 三.外键约束的问题...

MySQL程序介绍<一>
目录 MySQL程序简介 mysqld - MySQL 服务器 编辑 mysql - MySQL 命令⾏客⼾端 MySQL程序简介 1.MySQL安装完成通常会包含如下程序: Linux系统程序⼀般在 /usr/bin⽬录下,可以通过命令查看 windows系统⽬录: 你的安装路径\MySQL Server…...
Leetcode 第 419 场周赛题解
Leetcode 第 419 场周赛题解 Leetcode 第 419 场周赛题解题目1:3318. 计算子数组的 x-sum I思路代码复杂度分析 题目2:3319. 第 K 大的完美二叉子树的大小思路代码复杂度分析 题目3:思路代码复杂度分析 题目4:3321. 计算子数组的 …...

那些年 我们说走就走
那些年 我们说走就走 —— 2022-03-20 二月十八 春分 我总是钟情于原生景色,犹如那句 “落霞与孤鹜齐飞,秋水共长天一色。” 所绘。 我热爱骑行,向往自然,对有着 “中国人的景观大道” 之称的 318 国道川藏线憧憬已久。 17 年暑…...

MySQL初识
在了解什么是MySQL前,我们先了解一下什么是数据库?? 1. 数据库简介 1.1 什么是数据库 数据库是20世纪60年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的⼀个重要分⽀。数据库技术主要是⽤来解决数据处理的⾮数值计算问…...

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)
详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…...

利用 OBS 推送 WEBRTC 流到 smart rtmpd
webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…...
【python】极简教程3-函数
函数是将代码组织到可重用块中的一种方法。 函数调用 Python提供了许多内置函数,例如print: print(Hello, World!)函数调用通常包含函数名,后跟圆括号,括号内是参数列表。参数是传递给函数的数据,函数会基于这些数据执行操作。 数学函数 使用math函数前需要先导入mat…...

Python案例小练习——小计算器
文章目录 前言一、代码展示二、运行展示 前言 这是用python实现一个简单的计器。 一、代码展示 def calculate(num1, op, num2):if op "":return float(num1) float(num2)elif op "-":return float(num1) - float(num2)elif op "*":return…...

仓储数字化蓝图
1、仓储能力建设 2、仓储数字化建设...

【数字图像处理】第5章 图像空域增强方法
上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…...
idea 发布jar包
当你有一个能正常编译的项目,以springboot为例,有两步步骤 打包配置 打包 一、打包配置 1.点击右上角快捷按钮/文件-->项目结构,打开项目结构设置 2.项目结构-->Artifacts,如图所示选择 3.在Create JAR from Modules配置…...

c语言字符串函数strstr,strtok,strerror
1,strtok函数的使用和模拟实现 char * strtok(char * str,const char * sep) 会有static修饰变量,有记忆功能,会保存字符串的位置,下次找再继续找。 1)sep参数指向一个字符串,它包含了0个或者多个由sep字符中一个或…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...