Django与AJAX
AJAX简介
AJAX中文就是“异步的Javascript和XML”。即使用JavaScript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据本仅仅时XML)
AJAX不是新的编程语言,而是一种现有的标准新方法
AJAX不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行
同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求
下面举个AJAX应用小示例:
页面输入两个整数,通过AJAX传输到后端计算并返回结果局部刷新。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <input type="text" id="i1">+<input type="text" id="i2"> = <input type="text" id="i3"> <input type="submit" id="i4"> <script> $("#i4").on('click',function () { $.ajax( { url:'', type: 'post', data:{'i1':$('#i1').val(),'i2':$('#i2').val()}, success:function (data) { $('#i3').val(data) } } ) }) </script> </body> </html>
from django.shortcuts import render,HttpResponse # Create your views here. def index(request): if request.is_ajax(): if request.method == 'POST': i1 = request.POST.get('i1') i2 = request.POST.get('i2') res = int(i1)+int(i2) return HttpResponse(res) return render(request,'index.html')
AJAX优点:
1.AJAX使用JavaScript技术向服务器发送异步请求。
2.AJAX请求无需刷新整个页面
3.因为服务器相应内容不再是整个页面,而是页面中的部分内容,所以AJAX性能高。
4.两个关键点:1.局部刷新 2.异步请求
contentType前后端传输数据编码格式(******)
前后端传输数据编码格式:
1.urlencoded
2.formdata
3.json
下面我们研究两个 一个是 form表单 另一个是 ajax提交数据
form表单
默认使用的编码格式是urlencoded
数据格式:
django后端针对urlencoded编码格式的数据会自动解析并放到request.POST中供用户获取
可以修改为formdata传文件
django后端针对只要是符合urlenocded编码格式的数据(name=jason&pwd=123)都会自动解析并放到request.POST中供用户获取
如果是文件 只要你指定的编码是formdata 就会自动解析并放到request.FILES中
总结:前后端传输数据的时候,一定要保证数据格式和你的编码格式是一致的
ajax提交数据
ajax默认数据提交方式也是urlencoded
ajax发送json格式数据
django后端针对json格式的数据,并不会自动解析放到request.POST或者request.FILES里面
它并不会解析json格式数据 而是将它原封不动的放在request.body中了
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <input type="text" id="i1" name="name"> <input type="text" id="i2" name="password"> <input type="text" id="i3"> <input type="file" name="myfile"> <input type="submit" id="i4"> {#<form action="" method="post" enctype="multipart/form-data">#} {# <input type="text" id="" name="name">#} {# <input type="text" id="" name="password">#} {# <input type="file" name="myfile">#} {# <input type="submit">#} {#</form>#} <script> $("#i4").on('click',function () { $.ajax( { url:'', type: 'post', data:JSON.stringify({'name':'jason','password':123}), contentType:'application/json', success:function (data) { $('#i3').val(data) } } ) }) </script> </body> </html>
ajax传输文件
ajax传输文件 建议使用内置对象formdata var formdata = new FormData()
formdata既可以传普通的键值对,也可以传文件
传文件标签所存储的文件对象固定语法:
1.先使用jQuery查找到存储文件的input标签
2.将jQuery查找到存储文件的Input标签
3.利用原生js对象的方法 .files[0]获取到标签内部存储的文件对象
4.一定要指定两个参数都为false processData:false contentType:false
$('#b1').on('click',function () {
// ajax传输文件 建议使用内置对象formdata
var formData = new FormData(); // 既可以传普通的键值对 也可以传文件
// 添加普通键值
formData.append('username','jason');
formData.append('password','123');
// 传文件
// 如何获取文件标签所存储的文件对象? 固定语法
// 1.先用jQery查找到存储文件的input标签
// 2.将jQuery对象转成原生js对象
// 3.利用原生js对象的方法 .files[0]获取到标签内部存储的文件对象
// 4.一定要指定两个参数都为false
formData.append('my_file',$('#d1')[0].files[0]);
$.ajax({
url:'', // 控制发送给谁 不写就是朝当前地址提交
type:'post', // 发送方式是post请求
data:formData, // 发送的数据
// ajax发送文件需要指定两个额外的参数
processData:false, // 告诉前端不要处理数据
contentType:false, // 不适用任何编码 因为formdata对象自身自带编码 django后端也能够识别formdata对象
success:function (data) { // data形参用来接收异步提交的结果
{#alert(data)#}
// 将后端计算好的结果 通过DOM操作 渲染到第三个input矿中
$('#i3').val(data)
}
})
})
同样后端接收用 request.POST request.FILES
序列化组件
from django.core import serializers # django自带的一个小型的序列化工具 def reg(request): user_list = models.User.objects.all() res = serializers.serialize('json',user_list) return render(request,'index.html',locals()) [{ "model": "app01.user", "pk": 1,序列化组件 "fields": { "username": "jason", "age": 18, "gender": 1 } }, { "model": "app01.user", "pk": 2, "fields": { "username": "tank", "age": 24, "gender": 3 } }, { "model": "app01.user", "pk": 3, "fields": { "username": "egon", "age": 73, "gender": 2 } }, { "model": "app01.user", "pk": 7, "fields": { "username": "kevin", "age": 29, "gender": 4 } }]
Sweetalert搭建页面
<script> $('.del').on('click', function () { var $btEle = $(this); swal({ title: "Are you sure?", text: "Your will not be able to recover this imaginary file!", type: "warning", showCancelButton: true, confirmButtonClass: "btn-danger", confirmButtonText: "Yes, delete it!", closeOnConfirm: false }, function () { $.ajax( { url:'{% url 'delete_book' %}', type:'post', data:{'user_id':$btEle.attr('user_id')}, success:function (data) { if (data.code == 100){ $btEle.parent().parent().remove(); swal("Deleted!", "Your imaginary file has been deleted.", "success"); } else { swal("删除失败","出现Bug了",'error') } } } ) }); }) </script>