django—ajax

1、什么是ajax

异步的Javascript和XML

即使用Javascript与服务器异步交互,传输XML数据

特点:

异步交互:异步提交数据到服务器,并执行回调函数

局部刷新:即在不刷新页面的情况下,实现局部页面与服务器的交互

2、ajax语法结构

1、ajax有多种实现方式,我们学习基于JQuery封装的ajax

2、基于JQuery封装的ajax,必须先导入JQuery

语法结构:

$.ajax({
    url:'',  // 数据提交的后端地址,同form表单的actions属性
    type:'',  // 提交数据的请求方式,如get,post等
    data:{},  // key:value键值对,key为自定义的字符串,value是要提交的数据,通过JQuery语法取值
    success:function (data) {}  // ajax回调函数
})

3、数据编码格式

数据格式与编码格式是不同的概念,我们应做到两者一致

3.1 前后端传输数据的编码格式

1、浏览器与服务器交互数据的编码格式Content_Type

urlencoded : 如username=jason&password=123

fomadata :

application/json

2、针对不同的数据,后端进行不同的处理

文件类型的数据,会被封装到FILES中,后端通过request.FILES可获取数据

其他数据,会被封装到对应的请求中,如post请求,后端通过request.POST获取数据

json数据,后端不会做任何处理,通过request.body可以获取json数据

3.2 form表单发送数据的编码格式

1、form表单默认的编码格式是urlencoded

2、通过form表单发送文件,编码格式是Content-Type: multipart/form-data;

3、无法通过form表单发送json数据,只能借助于ajax

3.3 ajax发送数据的编码格式

可发送的数据编码格式

urlencoded

formdata

application/json

默认编码格式

urlencoded

4、基于ajax发送JSON数据

要点

1、指定编码格式为application/json

2、将数据序列化为json串,保证与编码格式一致(前端的序列化JSON)

3、后端处理json格式的数据,不会做任何处理,原封不动的封装到request.body中、

示例:

// 此处学习的是JQuery封装的ajax
// 提交按钮标签的id设置为d1
$('#d1').click(function () {
    $.ajax({
        url:'',
        type:'post',
        data:JSON.stringify({'username':'aaa','password':'123'})
        success:function (data) {
        alert('提交成功')
    }
    }) 
});

5、基于ajax发送文件数据

1、借助于内置对象new FormData()

2、该对象可以携带文件数据,也可以传键值对

3、在ajax中指定两个参数:

contentType:false 代表不使用任何编码格式,FormData()实例化的对象内部自带编码,django后端能够识别

processData:false 代表不对数据本身做任何处理

示例:

// 设置input框的id为d2
$('#d1').click(function () {
    var MyFormData = new FormData();
    MyFormData.append('username':'aaa'); // 传普通数据是键值对,而不是字典
    MyFormData.append('myfile',$('#d2')[0].files[0]);
    $.ajax({
        url:'',
        type:'post',
        data:MyFormData,
        contentType:false,
        processData:false,
    })
});

6、后端序列化数据

序列化目的:

将数据整合成一个大字典形式,再传给前端,方便数据的交互

一般用于前后端分离开发

后端代码:

drf django restframework
from app01 import models
from django.core import serializers

# 以视图函数index为例
def index(request):
    user_request = models.User.objects.all()
    res = serializers.serialize('aaa',user_request)
    return HttpResponse(res)
# res是一个字典套字典{{},{},{},{}...}
# 每一个数据表中的记录作为一个字典
# 前端接收到的只有所有的字典,没有最外层的字典

7、ajax结合sweetalert实现删除按钮的提示功能

7.1 前端

1、下载插件:Bootstrap-sweetalert

2、只需要用到其中的dist文件,在前端导入即可(配置static动态绑定)

3、sweetalert的swal用于提示

示例:

<!--index.html-->
<!--js代码-->
<script>
    $('.delete').click(function () {
        var $btn = $(this);
        swal({
                title: "你确定要删吗?",
                text: "你如果删了,你就准备好直接跑路吧!",
                type: "warning",
                showCancelButton: true,
                confirmButtonClass: "btn-danger",
                confirmButtonText: "是的,老子就要删!",
                cancelButtonText: "算了算了,不敢!",
                closeOnConfirm: false,
                closeOnCancel: false,
                showLoaderOnConfirm: true
            },
            function (isConfirm) {
                if (isConfirm) {
                    // 朝后端发送ajax请求
                    console.log(isConfirm);
                    $.ajax({
                        url: '',
                        type: 'post',
                        data: {'delete_id': $btn.attr('deleteId')},
                        success: function (data) {
                            if (data.code == 0) {

                                swal("准备跑路把!", data.msg, "success");
                                // 通过DOM操作 来直接操作标签
                                $btn.parent().parent().remove()
                            } else {
                                swal("有Bug", "发什么了未知的错误!", "warning");
                            }
                        }
                    });
                } else {
                    swal("怂逼", "数据都不敢删", "error");
                }
            });
    })
</script>

代码中的注意点:

1、给可删除的标签添加类delete,绑定事件click

2、下面是编写事件程序的注意点:

通过$(this)得到当前标签

3、要回传当前数据的id给服务器,通过设置标签自定义属性deleteId={{obj.id}}

4、通过$(this).attr('deleteId')获取要删除的数据id

5、通过DOM操作,实现局部的数据交互更新,但整个页面并不刷新

7.2 后端

def index(request):
    if request.is_ajax():
        back_dic = {'code': 0, 'msg': ''}
        delete_id = request.POST.get('delete_id')
        time.sleep(2)
        models.User.objects.filter(pk=delete_id).delete()
        back_dic['msg'] = '数据已经被我删掉了'
        return JsonResponse(back_dic)
    user_queryset = models.User.objects.all()
    return render(request,'index.html',locals())

注意点:

发送数据格式为JsonResponse,

posted @ 2019-12-02 16:56  W文敏W  阅读(182)  评论(0编辑  收藏  举报