Django环境下使用Ajax
Django环境下使用Ajax
目录
- Django环境下使用Ajax
- 介绍
- 前情提要
- 示例
- JS实现
- Ajax实现
- 传递JSON格式数据
- 传递文件数据
- Django自带的序列化组件
- 基于jsonresponse序列化数据
- 基于Django自带的serializers
- 注册示例
介绍
AJAX 的主要目标是在不刷新整个页面的情况下,通过后台与服务器进行数据交换和更新页面内容。通过 AJAX,您可以向服务器发送请求并接收响应,然后使用 JavaScript 动态地更新页面的部分内容
简单来说就是将后端数据进行加工后传给前端,再利用js对数据进行加工或判断后渲染到前端
AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行,AJAX 使用异步交互与服务器进行通信
- 同步交互:
- 客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
- 异步交互:
- 客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
前情提要
常见的发送请求方式:
- 浏览器地址直接输入
url回车GET请求
- a标签的
href属性GET请求/POST请求
- form表单
GET请求/POST请求
- Ajax
GET请求/POST请求
示例
预期效果

JS实现
<body>
<input type="text" id="num1">+
<input type="text" id="num2">=<input type="text" id="num3"><br>
<button id="b1">点我计算结果</button><script>document.getElementById('b1').addEventListener('click', function () {var num1 = document.getElementById('num1').valuevar num2 = document.getElementById('num2').valuevar sum = parseInt(num1) + parseInt(num2)document.getElementById('num3').value = sum})
</script>
</body>
Ajax实现
将要计算的参数通过data传递给后端
再由success接受后端返回的数据进行渲染
<body>
<input type="text" id="num1">+
<input type="text" id="num2">=<input type="text" id="num3"><br>
<button id="b1">点我计算结果</button><script>document.getElementById('b1').addEventListener('click', function () {var num1 = document.getElementById('num1').valuevar num2 = document.getElementById('num2').value$.ajax({{#url:指定当前数据提交的网址,如果不写就和form表单的action一样,默认释放前路由地址#}url:'',{#type:请求类型 GET / POST 默认是GET#}type:'post',{#data:传给后端的数据#}data:{'num1':num1,'num2':num2,},{#success:回调函数 接受后端传过来的数据#}success:function (data){console.log(data)document.getElementById('num3').value = data}})})
</script>
</body>
后端接受到data数据并返回sum参数
def test(request):if request.method == 'POST':data = request.POSTnum1 = data.get('num1')num2 = data.get('num2')sum = int(num1) + int(num2)return HttpResponse(sum)return render(request, 'app01/test.html', locals())
传递JSON格式数据
success获取由后端返回的数据并使用JSON.parse(data)进行数据转换,这样便可以直接用.属性获取参数
JSON.stringify:ajax中将需要传递的数据转换成json类型
json.loads(request.body.decode()):后端接受数据时需要通过request.body来获取请求体,然后loads手动解析json数据
<body>
<input type="text" id="num1">+
<input type="text" id="num2">=<input type="text" id="num3"><br>
<button id="b1">点我计算结果</button><script>document.getElementById('b1').addEventListener('click', function () {var num1 = document.getElementById('num1').valuevar num2 = document.getElementById('num2').value$.ajax({{#url:指定当前数据提交的网址,如果不写就和form表单的action一样,默认释放前路由地址#}url: '',{#type:请求类型 GET / POST 默认是GET#}type: 'post',{#data:以json格式传递给后端数据#}data: JSON.stringify({'num1': num1,'num2': num2,}),{#success:回调函数 接受后端传过来的数据#}success: function (data) {var new_data = JSON.parse(data)if (new_data.code != 200) {alert('非法数据')} else {console.log(data)document.getElementById('num3').value = new_data.sum}}})})
</script>
</body>
接受数据并返回json格式数据(主力这里回调函数用的是data.参数)
def test(request):if request.method == 'POST':# 提取json数据必须通过request.body获取请求体 并手动解析 JSON 数据data = json.loads(request.body.decode())num1 = data.get('num1')num2 = data.get('num2')sum = int(num1) + int(num2)# HttpResponse发送给前端的是str对象 需要在success重新转换类型return HttpResponse(json.dumps({'code':200,'sum':sum}))return render(request, 'app01/test.html', locals())
传递文件数据
<script>$(document).ready($("#btn_result").click(function () {let numberOne = $("#number1").val();let numberTwo = $("#number2").val();let fileVal = $("#file_input")[0].files[0];// Ajax携带文件数据需要借助第三方的 formData对象// (1)实例化得到一个 form对象// 将所有的键值对数据都要放到 form对象中let formDataObj = new FormData();formDataObj.append("numberOne", numberOne)formDataObj.append("numberTwo", numberTwo)formDataObj.append("file", fileVal)console.log(fileVal)console.log(formDataObj)// 基于Ajax发送请求$.ajax({// url:指定当前数据提交的网址,如果不写就和form表单的action一样,默认释放前路由地址url: "",// type:请求类型 GET / POST 默认是GETtype: "post",// data:传给后端的数据//(1)传输的data直接放上面的 form对象即可data: formDataObj,//(2)走form对象不能让他使用编码对数据进行编码contentType: false, // 默认编码是 urlencoded//(3)告诉浏览器不要对数据进行额外的处理processData: false,{#data: {'number_one': numberOne, "number_two": numberTwo},#}// success:回调函数 接受后端传过来的数据success: function (data) {console.log(data)console.log(typeof (data))// 使用 js自己的序列化方法序列化数据{#let dataVal = JSON.parse(data)#}console.log(typeof (data))if (data.code === 200) {$("#result").val(data.result)} else {alert("非法的数据")}}})}))
</script>
def test(request):if request.method == "POST":# 可以用来判断当前的请求方式是否是Ajaxprint(request.is_ajax()) # True# print(type(request.body.decode("utf-8")[0]))# 获取普通的键值对数据只需要通过 POST方法data = request.POSTprint(data) # <QueryDict: {'numberOne': ['2'], 'numberTwo': ['2']}># 获取form对象中的文件数据也要借助 FILESprint(request.FILES) # <MultiValueDict: {'file': [<InMemoryUploadedFile: avatar.jpg (image/jpeg)>]}>return JsonResponse({"code": 200, "result": "ok"})return render(request, "app01/test.html", locals())
Django自带的序列化组件
什么是序列化?
就是当我想要从数据库提取出数据后将数据对象转换为可以直接使用的数据的过程
基于jsonresponse序列化数据
from app01.models import Userdef get_user(request):# 查询所有的用户数据user_data_list = []# 此时获取到的是对象数据<QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>user_queryset = User.objects.all()# 将数据字段提取后装进列表for user_obj in user_queryset:user_data_list.append({"username": user_obj.username,"age": user_obj.age,"gender": user_obj.get_gender_display(),})print(user_data_list)# 将列表返回前端return JsonResponse(user_data_list,safe=False)
[{'username': 'drema', 'age': 18, 'gender': 'female'}, {'username': 'opp', 'age': 28, 'gender': 2}, {'username': 'hope', 'age': 38, 'gender': 'female'}]
基于Django自带的serializers
需要导入serializers模块
from app01 import models
from django.core import serializersdef test(request):author = models.Author.objects.all()author_list = serializers.serialize("json", author)print(author_list)return JsonResponse(user_data_list, safe=False)
[{"model": "app01.author", "pk": 1, "fields": {"name": "张三", "age": 11, "gender": 2}}, {"model": "app01.author", "pk": 2, "fields": {"name": "李四", "age": 19, "gender": 2}}]
注册示例
# 前端
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!-- 引入jQuery--><script src="{% static 'js/jquery.js' %}"></script><!-- 引入Bootstrap的CSS文件--><link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet"><!-- 引入Bootstrap的JavaScript文件--><script src="{% static 'js/bootstrap.js' %}"></script><style>/* 左侧空白区域 */.left-section {background-color: dimgrey;width: 25%;height: 100vh;position: fixed;top: 0;left: 0;}/* 右侧空白区域 */.right-section {background-color: dimgrey;width: 25%;height: 100vh;position: fixed;top: 0;right: 0;}.d1 {position: fixed;left: 35%;}.form-control:focus {outline: none;box-shadow: 0 0 5px cornflowerblue;}.btn-default + .btn-primary {margin-left: 150px; /* 调整为所需的间距 */}</style>
</head>
<body>
<div class="left-section"></div>
<div class="right-section"></div>
<div class="d1">
{# <form action="" method="post">#}<div class="form-group"><label for="username">用户名</label><br><input type="text" class="form-control" id="username" placeholder="Username"><br><hr></div><div class="form-group"><label for="pwd">密码</label><br><input type="password" class="form-control" id="password" placeholder="Password"><br><hr></div><div class="form-group"><label for="pwd2">再次输入密码</label><br><input type="password" class="form-control" id="password2" placeholder="Password"><br></div><button type="reset" class="btn btn-default">重置</button><button class="btn btn-primary" id="b1">确认</button>
{# </form>#}
</div><script>var b1 = document.getElementById("b1")$(document).ready(function () {b1.addEventListener('click', function () {$.ajax({url: '',type: 'post',data: JSON.stringify({'username': document.getElementById("username").value,'password': document.getElementById("password").value,'password2': document.getElementById("password2").value}),contentType: 'application/json',success: function (data) {alert(JSON.parse(data.state))},error: () => {console.log('错误')}})})})</script>
</body>
</html>
# 后端
def register(request):if request.method == 'POST' and request.is_ajax():# data = request.POSTdata = json.loads(request.body.decode())print(data)username = data.get('username')password = data.get('password')print(username, password)# models.User.objects.create(username=username,password=password)state = {'state': 200}return JsonResponse(state)return render(request, 'app01/register.html')
相关文章:
Django环境下使用Ajax
Django环境下使用Ajax 目录 Django环境下使用Ajax介绍前情提要示例JS实现Ajax实现 传递JSON格式数据传递文件数据Django自带的序列化组件基于jsonresponse序列化数据基于Django自带的serializers 注册示例 介绍 AJAX 的主要目标是在不刷新整个页面的情况下,通过后台…...
官方安装配置要求服务器最低2核4G
官方安装配置要求服务器至少2核、4G。 如果服务器低于这个要求,就没有必要安装,因为用户体验超级差。 对于服务器CPU来说,建议2到4核就完全足够了,太多就浪费了,但是内存越大越好,最好是4G以上。 如果服务器…...
Apache的运用与实战
WEB服务器 1、WEB服务简介 # 目前最主流的三个Web服务器是Apache、Nginx、 IIS。 - WEB服务器一般指网站服务器,可以向浏览器等Web客户端提供网站的访问,让全世界浏览。 - WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息…...
【漏洞复现】网康NS-ASG应用安全网关 index.php SQL注入漏洞(CVE-2024-2330)
0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和 IPSecQ,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短…...
网络基础『 序列化与反序列化』
🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌤️前言🌦️正文1.协议的重要性2.什么是序列化与反序列化&…...
腾讯云和阿里云4核8G云服务器多少钱一年和1个月费用对比
4核8G云服务器多少钱一年?阿里云ECS服务器u1价格955.58元一年,腾讯云轻量4核8G12M带宽价格是646元15个月,阿腾云atengyun.com整理4核8G云服务器价格表,包括一年费用和1个月收费明细: 云服务器4核8G配置收费价格 阿里…...
Git误操作补救错失:恢复误删的本地分支、将某个提交从一个分支复制到另一个分支
一、恢复误删的本地分支 作为一枚强迫症,没用的分支总是喜欢及时删删删删掉删掉统统删掉,结果今天发现有些分支还是应该保留。 比如,①前段时间切了个分支用来专门做图表,但因为需求还没有最终确定,已经上线了测试服而…...
MySQL系列-分析SQL性能
查找慢SQL MySQL 慢查询日志是用来记录 MySQL 在执行命令中,响应时间超过预设阈值的 SQL 语句。 开启慢查询 # 开启慢查询日志功能 SET GLOBAL slow_query_log ON; # 慢查询日志存放位置 SET GLOBAL slow_query_log_file /var/lib/mysql/ranking-list-slow.log…...
Java 学习和实践笔记(34):对象的转型(casting)
对象的转型(casting)有两种,一种是向上转型,一种是向下转型。 向上转型:父类引用指向子类对象。这属于自动类型转换,编译器会自动完成。 上一节的多态中,形参为父类Animal, 但是调用时实参为子类对象Dog&…...
【Qt】不透明指针(Opaque Pointer)在Qt源码中的应用
目录 什么是不透明指针(Opaque Pointer)不透明指针在Qt代码中的应用Qt中与不透明指针相关的一些宏 什么是不透明指针(Opaque Pointer) GeeksforGeeks中给的定义如下: An opaque pointer is a pointer that points to …...
【Python】牛客网—软件开发-Python专项练习
专栏文章索引:Python 1.(单选)下面哪个是Python中不可变的数据结构? A.set B.list C.tuple D.dict 可变数据类型:列表list[ ]、字典dict{ }、集合set{ }(能查询,也可更改)数据发生改…...
HBase分布式数据库的原理和架构
一、HBase简介 HBase是是一个高性能、高可靠性、面向列的分布式数据库,它是为了在廉价的硬件集群上存储大规模数据而设计的。HBase利用Hadoop HDFS作为其文件存储系统,且Hbase是基于Zookeeper的。 二、HBase架构 *图片引用 Hbase采用Master/Slave架构…...
c#类属性与字段例说说
在C#中,类属性(Properties)和字段(Fields)是两种用于存储和访问数据的机制。 属性是一种特殊的方法,通过使用get和set访问器来定义,用于读取和写入类的私有字段。属性可以提供对字段的封装&…...
Linux Centos系统 磁盘分区和文件系统管理 (深入理解)
CSDN 成就一亿技术人! 作者主页:点击! Linux专栏:点击! CSDN 成就一亿技术人! 前言———— 磁盘 在Linux系统中,磁盘是一种用于存储数据的物理设备,可以是传统的硬盘驱动器&am…...
华为配置ISP选路实现报文按运营商转发
CLI举例:配置ISP选路实现报文按运营商转发 介绍通过配置ISP选路实现报文按运营商转发的配置举例。 组网需求 如图1所示,FW作为安全网关部署在网络出口,企业分别从ISP1和ISP2租用一条链路。 企业希望访问Server 1的报文从ISP1链路转发&#…...
软件测试APP完整测试作业流程(附流程图),公司级软件测试流程化办公
目录 1. 概述 2. 软件测试流程 3. 软件测试周期人员活动图 4. 总结 1. 概述 1.1 目的 有效的保证软件质量; 有效的制定不同测试类型(软件系统测试、音频主观性测试、Field Trial、专项测试、自动化测试、性 能测试、用户体验测试)的软件…...
搭建交换机模拟环境及SSH连接,华为NSP软件入门使用教程
搭建交换机模拟环境及SSH连接,华为NSP软件入门使用教程 如果你是通过搜索搜到了这篇文章,那么一定是工作或者学习中需要用交换机,但是又没物理机测试学习,所以需要搭建本地的虚拟环境学习。 这篇文章是我进行交换机命令入门学习写…...
mineadmin 快速安装部署(docker环境)
前提条件:已安装docker 一、下载dnmp环境包 github地址:https://github.com/tomorrow-sky/dnmp gitee地址: https://gitee.com/chenjianchuan/dnmp 二、看一下dnmp包目录结构 三、打开docker-compose.yml 文件,将不需要…...
【力扣刷题练习】93. 复原 IP 地址
题目描述: 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011…...
linux查看文件内容cat,less,vi,vim
学习记录 目录 catlessvi vim cat 输出 FILE 文件的全部内容 $ cat [OPTION] FILE示例 输出 file.txt 的全部内容 $ cat file.txt查看 file1.txt 与 file2.txt 连接后的内容 $ cat file1.txt file2.txt为什么名字叫 cat? 当然和猫咪没有关系。 cat 这里是 co…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
