django和ajax

django 和ajax

Ajax

"""
异步提交
局部刷新
例子:github注册
	动态获取用户名实时的跟后端确认并实时展示的前端(局部刷新)
	
朝发送请求的方式
	1.浏览器地址栏直接输入url回车						   GET请求
	2.a标签href属性											    GET请求
	3.form表单														 GET请求/POST请求
	4.ajax																GET请求/POST请求	
	
AJAX 不是新的编程语言,而是一种使用现有标准的新方法(比较装饰器)


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


Ajax我们只学习jQuery封装之后的版本(不学原生的 原生的复杂并且在实际项目中也一般不用)
所以我们在前端页面使用ajax的时候需要确保导入了jQuery
ps:并不只有jQuery能够实现ajax,其他的框架也可以 但是换汤不换药 原理是一样的
"""

小例子

"""
页面上有三个input框
	在前两个框中输入数字 点击按钮 朝后端发送ajax请求
	后端计算出结果 再返回给前端动态展示的到第三个input框中
	(整个过程页面不准有刷新,也不能在前端计算)
"""
$('#btn').click(function () {
        // 朝后端发送ajax请求
        $.ajax({
            // 1.指定朝哪个后端发送ajax请求
            url:'', // 不写就是朝当前地址提交
            // 2.请求方式
            type:'post',  // 不指定默认就是get 都是小写
            // 3.数据
            {#data:{'username':'jason','password':123},#}
            data:{'i1':$('#d1').val(),'i2':$('#d2').val()},
            // 4.回调函数:当后端给你返回结果的时候会自动触发 args接受后端的返回结果
            success:function (args) {
                {#alert(args)  // 通过DOM操作动态渲染到第三个input里面#}
                {#$('#d3').val(args)#}
                console.log(typeof args)

            }
        })
    })
              
              
"""
针对后端如果是用HttpResponse返回的数据 回调函数不会自动帮你反序列化
如果后端直接用的是JsonResponse返回的数据 回调函数会自动帮你反序列化

HttpResponse解决方式
	1.自己在前端利用JSON.parse()
	2.在ajax里面配置一个参数
			(后面再讲)
"""

前端传输数据的编码格式

前后端传输数据的编码格式有三种方式

  • urlencoded
  • formdata
  • json

form表单

from默认编码格式是urlencoded

数据格式跟get请求格式特别像

username=zc&password=.... 

但是在django后端针对符合urlencoded编码格式的数据都会自动解析封装到request.POST中,但是如果你把form表单编码格式改成 enctype="multipart/form-data",针对普通的键值对还是会解析到request.POST里面去,会将文件格式解析到request.FILES中,form 表单是无法发送json数据的格式

ajax

ajax默认编码格式是urlencoded

数据格式

username=zc&password=.... 

总结:django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中username=zc&password=.... 像这样的格式都会到request.POST

ajax 发送json数据和文件

ajax发送json数据

前后端传输数据一定要保证编码格式跟真正的数据格式一直,如果你给别人传过来的是一个list前端是无法点属性的,

<script>
   $('#d1').click(function () {
       $.ajax({
           url:'',
           type:'post',
           data:JSON.stringify({'username':'zc','age':15}),
           contentType:'application/json', //指定编码格式
           success:function () {

           }

       })

   })
</script>

指定编码格式需要加参数 contentType:'application/json',然后你告诉别人你发的是json格式,但是你发的不是,这里你需要把数据转成json格式 data:JSON.stringify({'username':'zc','age':15}),

ajax发送json数据格式

{username: "zc", age: 15}

在reques.POST里面是找不到的不符合它的解析格式,你用reques.POST是找不到的,针对这种json格式django后端放在了 request.body里面

def ab_json(request):
    if request.is_ajax():
        # print(request.body) # b'{"username":"zc","age":15}'
        json_bytes =request.body
        json_dict = json.loads(json_bytes)# json.loads括号内传入了一个二进制格式的数据内部自动解码再反序列化
        print(json_dict,type(json_dict))

    return render(request, 'ab_json.html')

这里它拿到的是二进制格式jison格式的字符串,针对前端发过来的json格式需要你总结处理

request.is_ajax(),判断当前请求是否是ajax请求 返回布尔值

ajax发送文件

ajax发送文件需要js内置对象FormData

<script>
    // 点击按钮朝后端发送普通键值对和文件数据
    $('#d4').on('click',function () {
        // 1 需要先利用FormData内置对象
        let formDateObj = new FormData();
        // 2 添加普通的键值对
        formDateObj.append('username',$('#d1').val());
        formDateObj.append('password',$('#d2').val());
        // 3 添加文件对象
        formDateObj.append('myfile',$('#d3')[0].files[0])
        // 4 将对象基于ajax发送给后端
        $.ajax({
            url:'',
            type:'post',
            data:formDateObj,  // 直接将对象放在data后面即可

            // ajax发送文件必须要指定的两个参数
            contentType:false,  // 不需使用任何编码 django后端能够自动识别formdata对象
            processData:false,  // 告诉你的浏览器不要对你的数据进行任何处理

            success:function (args) {
            }
        })


    })
</script>

def ab_file(request):
    if request.is_ajax():
        if request.method == 'POST':
            print(request.POST)
            print(request.FILES)
    return render(request,'ab_file.html')

总结

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

ajax结合sweetalert

<script>
    $('.del').on('click',function () {
        // 先将当前标签对象存储起来
        let currentBtn = $(this);
        // 二次确认弹框
        swal({
          title: "你确定要删吗?",
          text: "你可要考虑清除哦,可能需要拎包跑路哦!",
          type: "warning",
          showCancelButton: true,
          confirmButtonClass: "btn-danger",
          confirmButtonText: "是的,老子就要删!",
          cancelButtonText: "算了,算了!",
          closeOnConfirm: false,
          closeOnCancel: false,
          showLoaderOnConfirm: true
        },
        function(isConfirm) {
          if (isConfirm) {
                // 朝后端发送ajax请求删除数据之后 再弹下面的提示框
                $.ajax({
                    {#url:'/delete/user/' + currentBtn.attr('delete_id'),  // 1 传递主键值方式1#}
                    url:'/delete/user/',  // 2 放在请求体里面
                    type:'post',
                    data:{'delete_id':currentBtn.attr('delete_id')},
                    success:function (args) {  // args = {'code':'','msg':''}
                        // 判断响应状态码 然后做不同的处理
                        if(args.code === 1000){
                            swal("删了!", args.msg, "success");
                            // 1.lowb版本 直接刷新当前页面
                            {#window.location.reload()#}
                            // 2.利用DOM操作 动态刷新
                            currentBtn.parent().parent().remove()
                        }else{
                            swal('完了','出现了位置的错误','info')
                        }
                    }

                })

          } else {
            swal("怂逼", "不要说我认识你", "error");
          }
        });
    })

</script>
posted @ 2020-06-02 22:59  小子,你摊上事了  阅读(113)  评论(0编辑  收藏  举报