Django中数据传输编码格式、ajax发送json数据、ajax发送文件、django序列化组件、ajax结合sweetalert做二次弹窗、批量增加数据

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

提交post请求的两种方式:

  • form表单
  • ajax请求

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

  • urlencoded
  • formdata(form表单里的)
  • jaon

研究form表单

image

image

默认的数据编码格式是urlencoded
数据格式:username=jason&password=123

当提交方式改为enctype="multipart/form-data"后

image

总结

urlencoded编码格式

django后端针对符合urlencoded编码格式的数据会自动帮你解析封装到request.POST中
eg: username=jason&password=123	>>> request.POST

formdata编码格式

针对普通的键值对还是解析到request.POST中,而将文件解析到request.FILES中

json

form表单不支持发送json数据

研究ajax

image

默认的编码格式是urlencoded
数据格式:username=jason&age=20

总结

django后端针对符合urlencoded编码格式的数据都会自动帮你解析封装到request.POST中
  	username=jason&age=20	>>> request.POST

ajax发送json格式数据

注意事项

1.contentType参数指定成: application/json

2.数据必须是json数据,不是要用JSON.stringify转成json格式

3.django后端要用request.body获取并处理而不是用request.POST

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

前端ajax

<script>
    $('#d1').click(function (){
        $.ajax({
            url:'',  # 朝哪发数据
            type:'post',  # 指定请求方式
            contentType:'application/json',  # 指定编码格式
            data:JSON.stringify({'username': 'jason', 'pwd': 123}),  # 序列化成json格式
            success:function (args){

            }
        })
    })
</script>

后端接收数据

    if request.is_ajax():
        if request.method == 'POST':
            dic_json = request.body  # body接收的数据是二进制格式
            dic = json.loads(dic_json)  # json特点:自动解码并且反序列化(可以减少一步操作)
            print(dic)  

image

ajax发送文件

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

前端ajax

<p>username:<input type="text" id="d1"></p>
<p>password:<input type="text" id="d2"></p>
<p>file: <input type="file" id="d3"></p>
<button class="btn btn-primary" id="d4">点我</button>

<script>
    $('#d4').on('click', function (){
        // 1.需要先利用FormData内置对象
        let formDataObj = new FormData()
        // 2.添加普通键值对
        formDataObj.append('username', $('#d1').val())
        formDataObj.append('password', $('#d2').val())
        // 3.添加文件对象
        formDataObj.append('myfile', $('#d3')[0].files[0])
        // 4.将对象基于ajax发送给后端
        $.ajax({
            url:'',
            type:'post',
            data:formDataObj, // 直接将对象放在data后面即可
            // 5.ajax发送文件必须要指定两个参数
            contentType:false,  // 告诉浏览器不要修改提交的数据格式
            processData:false,  // 告诉浏览器不要对提交的数据进行任何的更改
            success:function (args){
            }
        })
    })
</script>

后端接收文件

def file(request):
    if request.method == 'POST':
        print(request.POST)
        print(request.FILES)
        file_obj = request.FILES.get('myfile')
        print(file_obj.name)
    return render(request, 'file.html')

image

django自带的序列化组件

在前后分离的项目中,不能使用模板语法,只能用过json格式来实现数据的交互,一般数据的组成都是列表套字典

手动

def drf(request):
    from django.http import JsonResponse
    user_queryset_list = models.User.objects.all()
    # 不用组件手动的添加字典
    user_list = []
    for user_obj in user_queryset_list:
        temp = {
            'pk': user_obj.pk,
            'username': user_obj.username,
            'age': user_obj.age,
            'sex': user_obj.get_sex_display(),
        }
        user_list.append(temp)
    return JsonResponse(user_list, safe=False, json_dumps_params={'ensure_ascii': False})

image

组件序列化

def drf(request):
    from django.http import JsonResponse
    from django.core import serializers
    user_queryset_list = models.User.objects.all()
    # 序列化
    res = serializers.serialize('json', user_queryset_list) # 指定json格式 然后传入数据
    return JsonResponse(res, safe=False)
 """会自动帮你将数据变成json格式的字符串 并且内部非常的全面"""
    
前后端分离的项目
作为后端开发的你只需要写代码将数据处理好
能够序列化返回给前端即可 
再写一个接口文档 告诉前端每个字段代表的意思即可

写接口就是利用序列化组件渲染数据然后写一个接口文档 该交代交代一下就完事

image

ajax结合sweetalert做弹窗效果

前端

"""
自己要学会如何拷贝
学会基于别人的基础之上做修改
研究各个参数表示的意思 然后找葫芦画瓢
"""
下面style是为了处理一些显示BUG
<style>
        div.sweetalert h2 {
            padding-top: 10px;
        }
</style>


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

后端

def delete(request):
    user_list = models.User.objects.filter(is_delete=0)
    if request.is_ajax():
        if request.method == 'POST':
            del_id = request.POST.get('id')
            models.User.objects.filter(pk=del_id).update(is_delete=1)
            back_dic = {'status': 200, 'msg': '删除成功'}
            return JsonResponse(back_dic)
    return render(request, 'delete.html', locals())

image

这是显示的BUG,按最上面的style改一下就好

image

最终版

image

总结

1.以后要获取标签内的属性可以通过自定义的方式,不要局限于标签固有的属性
用jqery对象.attr(属性名)  就可以获得到对应的属性值
如果是获取input框用户输入的数据 就用jqery对象.val()
2.还有一个设置点击事件的方法就是在标签内部定义
eg:  <button onclick="del(可以传参)">删除</button>
    然后在<script>	  function del(参数){...}  </script>
3.标签的id是不可重复的,可以用拼接的方式使id不重复
eg:  <a  onclick="del({{ user_obj.id }})" id="btn_{{ user_obj.id }}">删除</a>
获取标签对象可以用拼接来获取
<script>
function del(id){
	$('#btn_' + id )  // 这样也是可以的  等价于  $('#btn_1') 、$('#btn_2')...
}
</script>

批量插入

格式: bulk_create

普通插入数据

def ab_pl(request):
   先给Book插入一万条数据
    for i in range(10000):
        models.Book.objects.create(title='第%s本书'%i)
    # 再将所有的数据查询并展示到前端页面
    book_queryset = models.Book.objects.all()
    return render(request,'ab_pl.html',locals())

# 很慢  响应时间大概10s左右  还只是10000条数据

批量插入

批量插入
     book_list = []
     for i in range(100000):
         book_obj = models.Book(title='第%s本书' % i)
         book_list.append(book_obj)
     models.Book.objects.bulk_create(book_list)  # 批量插入数据 使用列表套对象
    return render(request,'ab_pl.html',locals())

# 用时3s 而且数据还是100000条
posted @ 2022-03-08 14:52  zong涵  阅读(159)  评论(0编辑  收藏  举报