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…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...