Django 与 Ajax
创始人
2024-04-03 23:26:50

Ajax(重点)

  • 异步提交
  • 局部刷新
"""案例:github注册示例,动态获取用户名,实时的跟后端确认并实时展示到前端(局部刷新)发送请求方式 1 浏览器地址栏直接输入url回车     GET请求2 a标签href属性				   GET请求3 form表单					POST请求/GET请求4 ajax						 POST请求/GET请求"""

1、简介

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
Ajax只学习jQuery封装好之后的版本,所以在前端页面使用ajax的时候需要确保导入jQuery

2、Ajax语法

案例引入:"""
页面有三个input框在前两个框中输入数字,点击按钮,朝后端发送到ajax请求后端计算出结果,再返回给前端动态展示到第三个input框(整个过程不允许有刷新,也不能再前端计算)"""
# index.html
+
=

""" 针对后端,如果是用HttpResponse返回的json数据,前端回调函数不会自动反序列化, 如果后端直接用的JsonResponse返回的数据,回调函数会自动反序列化HttpResponse解决方式1 自己再前端用JSON.parse()2.在ajax里配置一个参数dataType:'JSON' """

当利用ajax进行前后端交互的时候,后端无论返回什么,都只会被回调函数接收,而不再影响这个浏览器页面

# views.pyfrom django.shortcuts import render, HttpResponsefrom django.http import JsonResponse# Create your views here.
def ab_ajax(request):if request.method == 'POST':# print(request.POST)# d1 = request.POST.get('d1')# d2 = request.POST.get('d2')# # 先转成整型# d3 = int(d1) + int(d2)# print(d3)d={'code':100,'msg':666}# return HttpResponse(d3)# return HttpResponse(json.dumps(d))return HttpResponse(JsonResponse(d))return render(request, 'index.html')
# urls.pyfrom django.contrib import admin
from django.urls import path
from app01 import  views
urlpatterns = [path('admin/', admin.site.urls),#ajax相关path('ab_ajax/',views.ab_ajax)
]

3、前后端传输数据的编码格式(contentType)

# 主要研究 post请求数据的编码格式"""
get请求数据就是直接放在url后面的  url?username=zhao&password=123
"""#可以朝后端发送post的请求方式"""1. form表单2. Ajax请求"""# 前后端传输数据的编码格式"""urlencodedfromdatajson"""

3.0、代码

# index.html

username:

password:

file:

# views.pyfrom django.shortcuts import render# Create your views here.
def index(request):if request.method =='POST':print(request.POST)print(request.FILES)return render(request,'index.html')
# urls.py from django.contrib import admin
from django.urls import path
from app01 import  views
urlpatterns = [path('admin/', admin.site.urls),#前后端编码格式研究path('index/',views.index)
]

3.1、form表单

默认的编码格式是urlencoded
数据格式:username=zhao&password=123
django后端针对符合urlencoded编码格式的数据会自动的帮你解析封装到request.POST中username=zhao&password=123  >>> request.POST如果把编码格式改成formdata,那么针对普通的键值对还是解析到request.POST中而将文件解析到request.FILES中form表单没有办法发送json格式
  • 默认的编码格式

在这里插入图片描述

  • 数据格式

在这里插入图片描述

点击 view source

在这里插入图片描述

  • django后端针对符合urlencoded编码格式的数据会自动的帮你解析封装到request.POST中

在这里插入图片描述

在这里插入图片描述

  • 如果把编码格式改成formdata,那么针对普通的键值对还是解析到request.POST中,而将文件解析到request.FILES中

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2、ajax

默认编码格式也是urlencoded
数据格式也是:username=tony&age=19
django后端针对符合urlencoded编码格式的数据会自动的帮你解析封装到request.POST中username=zhao&password=123  >>> request.POST

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QgZUZyY5-1667571082757)(E:/MarkDown/markdown/imgs/image-20221102204855809.png)]

  • 编码格式

在这里插入图片描述

  • 数据格式

在这里插入图片描述

  • django后端针对符合urlencoded编码格式的数据会自动的帮你解析封装到request.POST中

在这里插入图片描述

4、ajax发送json格式数据

前后端传输数据的时候一定要确保编码格式数据格式一致

"""
前后端传输数据的时候一定要确保编码格式跟数据真正的格式是一致的{"username":"zhao","age":19} 在request.POST里肯定找不到
"""request对象补充request.is_ajax()判断当前请求是否是ajax请求,返回布尔值django对json格式的数据不会做任何的处理

代码:




# views.pydef ab_json(request):# print(request.is_ajax())  # 判断当前请求是否是ajax请求,返回布尔值if request.is_ajax():# print(request.POST)# print(request.body)# 针对json格式数据需要自己手动处理json_bytes = request.body  # 二进制数据# json_str = json_bytes.decode('utf-8')  # 将二进制转成字符串# json_dic = json.loads(json_str)"""json.loads括号内如果传入了一个二进制数据,那么内部可以自动解码再反序列化"""json_dic = json.loads(json_bytes)print(json_dic, type(json_dic))return render(request, 'ab_json.html')
# urls.pyfrom django.contrib import admin
from django.urls import path
from app01 import  views
urlpatterns = [path('admin/', admin.site.urls),#ajax发送json格式的数据path('ab_json/',views.ab_json)
]

ajax发送json格式数据需要注意以下几点

  1. contentType参数指定成application/json
  2. 确保是真正的json格式数据,JSON.stringify()
  3. django后端不会自动处理json格式,需要去request.body中获取数据并处理

  • 指定编码格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6WR3p7n-1667571082762)(E:/MarkDown/markdown/imgs/image-20221102205741523.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VoNX5jRi-1667571082764)(E:/MarkDown/markdown/imgs/image-20221102205908090.png)]

  • 但是此时要发送的数据并不是json格式,需要转成json格式
  • 前端使用JSON.stringify()将想要发送的数据转成json格式的数据
data: JSON.stringify({'username': 'zhao', 'age': 19}),

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZMTIWlR-1667571082767)(E:/MarkDown/markdown/imgs/image-20221102210354092.png)]

  • 查看json格式数据
{"username":"zhao","age":19}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VL48HgAk-1667571082769)(E:/MarkDown/markdown/imgs/image-20221102210714716.png)]

  • request.POST中找不到数据
    在这里插入图片描述

  • request.body中获取数据,转成json格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N5YgLLOv-1667571082770)(E:/MarkDown/markdown/imgs/image-20221103171457707.png)]

json.loads() 括号内如果传入了一个二进制数据,那么内部可以 自动解码再反序列化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qjkVyu13-1667571082772)(E:/MarkDown/markdown/imgs/image-20221102213336984.png)]

5、ajax发送文件数据

"""ajax发送文件需要借助于js内置对象FormData"""

username:

password:

# views.pydef ab_file(request):if request.is_ajax():if request.method == 'POST':print(request.POST)print(request.FILES)return render(request, 'ab_file.html')
# urls.pyfrom django.contrib import admin
from django.urls import path
from app01 import viewsurlpatterns = [path('admin/', admin.site.urls),# ajax发送文件path('ab_file/', views.ab_file),
]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLUEyT5D-1667571082773)(E:/MarkDown/markdown/imgs/image-20221102221448232.png)]

总结:

  1. ajax发文件需要利用内置对象FormData
       let formDataObj = new FormData();//2. 添加普通的键值对formDataObj.append('username', $('#d1').val());formDataObj.append('password', $('#d2').val());//3. 添加文件对象formDataObj.append('myfile', $('#d3')[0].files[0])
  1. 需要指定两个关键性参数
contentType: false, //不需要使用任何编码,django后端能自动识别formdata对象
processData: false, //告诉浏览器不要对数据进行任何处理
  1. django后端能自动识别FormData对象,能够将内部的普通键值自动封装到request.POST中,文件数据能自动解析封装request.FILES

6、Ajax结合sweetalert实现删除按钮的二次确认

数据展示

{% for user_obj in user_queryset %}{% endfor %}
IDusernameagegenderdescribe
{{ user_obj.pk }}{{ user_obj.age }}{{ user_obj.username }}{{ user_obj.gender }}

# views.pydef delete_user(request):"""前后端在使用ajax进行交互的时候,后端通常给ajax回调函数返回一个字典格式的数据字典返回到前端就是一个自定义对象,前端可以通过.的方式拿到想要的数据:param request::return:"""if request.is_ajax():if request.method == 'POST':# code:1000 为响应状态码back_dic = {'code': 1000, 'msg': ''}# 取到前端返回用户想要删除数据的主键值delete_id = request.POST.get('delete_id')models.User.objects.filter(pk=delete_id).delete()back_dic['msg'] = '数据已删除'# 需要告诉前端操作的结果return JsonResponse(back_dic)

在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...