当前位置: 首页 > news >正文

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">&times;</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">&times;</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">&times;</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管理系统 - 部门管理 - 新增部门”中&#xff0c;我们通过传统的新增页面来实现部门的添加。 在本文中&#xff0c;我们通过模态框和ajax来实现管理员的新增。 首先在admin_list.html中新建入口&#xff0c;使用按钮 <div class"panel-heading&quo…...

Mysql中表字段VARCHAR(N)类型及长度的解释

本文将针对MySQL 中 varchar (N)类型字段的存储方式进行解释&#xff0c;主要是对字符和字节的关系的理解。 1. varchar (N) 中的 N varchar (N) 中的 N 表示字符数&#xff0c;而不是字节数。这意味着 N 表示你可以存储多少个字符。 字符数&#xff1a;指的是字符的个数&…...

git提交信息写错处理方式

在Git中&#xff0c;你可以通过使用rebase命令来合并提交记录。以下是一个简单的步骤来合并一系列提交&#xff1a; 使用git rebase -i开始交互式变基。在打开的编辑器中&#xff0c;你会看到一个提交列表。若要合并提交&#xff0c;将要合并的提交前面的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 实现的开源可视化库&#xff0c;可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xff0c;…...

网络学习笔记

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

[论文笔记]HERMES 3 TECHNICAL REPORT

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

MySQL-19.多表设计-一对多-外键

一.多表问题分析 二.添加外键 三.外键约束的问题...

MySQL程序介绍<一>

目录 MySQL程序简介 mysqld - MySQL 服务器 ​编辑 mysql - MySQL 命令⾏客⼾端 MySQL程序简介 1.MySQL安装完成通常会包含如下程序&#xff1a; Linux系统程序⼀般在 /usr/bin⽬录下&#xff0c;可以通过命令查看 windows系统⽬录&#xff1a; 你的安装路径\MySQL Server…...

Leetcode 第 419 场周赛题解

Leetcode 第 419 场周赛题解 Leetcode 第 419 场周赛题解题目1&#xff1a;3318. 计算子数组的 x-sum I思路代码复杂度分析 题目2&#xff1a;3319. 第 K 大的完美二叉子树的大小思路代码复杂度分析 题目3&#xff1a;思路代码复杂度分析 题目4&#xff1a;3321. 计算子数组的 …...

那些年 我们说走就走

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

MySQL初识

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

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…...

利用 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包

当你有一个能正常编译的项目&#xff0c;以springboot为例&#xff0c;有两步步骤 打包配置 打包 一、打包配置 1.点击右上角快捷按钮/文件-->项目结构&#xff0c;打开项目结构设置 2.项目结构-->Artifacts&#xff0c;如图所示选择 3.在Create JAR from Modules配置…...

c语言字符串函数strstr,strtok,strerror

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

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...