zoukankan      html  css  js  c++  java
  • Django-5

    Django-5

    choice参数

    在创建表的过程中,如果遇到重复的数据时,我们可以用数字来代替这个字段对应的记录,比如性别,只有男女之分,所以我们可以事先定义好性别的类别,1表示男,2表示女,然后我们就可以在插入数据时,直接使用这个对应关系了。

    choices = (
            (1,'male'),
            (2,'female'),
            (3,'others')
            )
    gender = models.IntegerField(choices=choices)
    

    当你直接拿到gender字段时,显示出来的还是数字,那么如何拿到该数字表示的对应关系呢?

    user_obj = models.Userinfo.objects.filter(pk=4).first()
    print(user_obj.get_gender_display())  
    # 固定句式   数据对象.get_字段名_display()
    

    注意:当自定义的对应关系中有时,取出来的时对应关系,没有时,取出来的依然是数字。

    MTV和MVC模型

    Django号称是MTV框架,实质上,它还是MVC框架。异步提交

    • MTV:
      • M : models
      • T : templates
      • V: views
    • MVC:
      • M : models
      • V : views
      • C: contronner(路由分配)

    Ajax异步提交

    同步异步:描述的任务的提交方式

    • 同步:提交任务之后 原地等待任务的返回结果 期间不干任何事儿
    • 异步:提交任务之后 不愿地等待 直接执行下一行代码 任务的返回通过回调机制

    局部刷新:一个页面,不是整体刷新,而是页面中的某个地方局部刷新。

    AJAX 不是新的编程语言,而是一种使用现有标准的新方法(是一门js的技术 基于原生js开发的)。

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

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

    • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
    • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

    Ajax语法演示

    # views.py
    def add(request):
        if request.is_ajax():
            if request.method == 'POST':
                t1 = request.POST.get('t1')
                t2 = request.POST.get('t2')
                res = int(t1) + int(t2)
                return HttpResponse(res)
        return render(request, 'add.html')
    
    # add.html
        <h1>A+B=???</h1>
        <p>A:<input type="text" class="form-control a"></p>
        <p>B:<input type="text" class="form-control b"></p>
        <p>C:<input type="text" class="form-control c"></p>
        <br>
        <button id="btn">计算</button>
    
    <script>
        $('#btn').on('click',function () {
            $.ajax({
                url:'',
                type:'post',
                {#contentType:'application/json',#}
                data:{'t1':$('.a').val(),'t2':$('.b').val()},
                success:function (data) {
                    $('.c').val(data)
                    $('.a').val('')
                    $('.b').val('')
                    alert('计算成功!')
                }
            })
        })
    </script>
    
    # 分析:
    url:'', : 专门用来控制朝后端提交数据的地址,不写默认就是朝当前地址提交。
    type:'', : 专门指定Ajax发送得到请求方式。
    contenType:'', : 告诉后端你当前的数据格式到底是什么类型。
    data:'', : 向后端发送的数据。
    success:function(data){} : data形参指代的是异步提交的返回结果,success指定回调函数,可对后端返回数据做处理。
    

    Ajax传Json格式数据

    Django后端针对json格式的数据,不会自动帮你解析,会直接原封不动的给你放到request.body中,可以手动处理,获取数据。

    $("#btn").on('click',function () {
        $.ajax({
            url:'',
            type:'post',
            // 指定提交的数据的类型为json
            contentType:'application/json',
            // 将自定义对象序列化为json数据。
            data:JSON.stringify({'username':'nick','password':'123'}),
            success:function (data) {
                alert(data)
            }
        })
    })
    
    def index(request):
    	# 判断提交方式是否为Ajax
        if request.is_ajax():
            if request.method == 'POST':
                json_data = str(request.body,encoding='utf8')
                json_dic = json.loads(json_data)
                print(json_dic,type(json_dic))
                return HttpResponse(json_dic)
        return render(request,'index.html')
    

    Ajax传文件

    • 需要利用内置对象 Formdata
    • 该对象既可以传普通的键值 也可以传文件
    <body>
    <input type="text" name="username" id="a">
    <input type="text" name="password" id="b">
    <input type="file" name="myfile" id="c">
    <button id="btn">提交</button>
    <script>
        $('#btn').on('click',function () {
           // 生成form_data对象
            var form_data = new FormData();
            在form_data对象中添加普通的键值
            form_data.append('username',$('#a').val());
            form_data.append('password',$('#b').val());
            // 朝form_data对象中添加文件数据
            	// 1.先通过jquery查找到该标签
            	// 2.利用索引0转换成原生的js对象
            	// 3.利用原生s对象的file()方法,直接获取文件的内容
            form_data.append('myfile',$('#c')[0].files[0]);
            $.ajax({
                url:'',
                type:'post',
                data:form_data, // 直接将对象当作数据
                contentType:false, // 不使用任何编码,因为form_data对象自带编码
                processData:false, // 告诉浏览器不要处理,直接发就行
                success:function (data) {
                    alert(data)
                }
            })
        })
    </script>
    </body>
    
    def upload(request):
        if request.is_ajax():
            if request.method == 'POST':
                print(request.POST)
                print(request.FILES)
                return HttpResponse('已收到文件!')
        return render(request,'upload.html')
    """
    ajax传文件需要注意的事项
    1.利用formdata对象 能够简单的快速传输数据 (普通键值 + 文件)
    2.有几个参数
    	data:formdata对象
    
    	contentType:false
    	processData:false
    
    """
    

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

    form表单,默认的提交数据的编码格式是urlencoded

    urlencoded

    • username=admin&password=123这种就是符合urlencoded数据格式
    • django后端针对username=admin&password=123的urlencoded数据格式会自动解析
      将结果打包给request.POST 用户只需要从request.POST即可获取对应信息

    formdata

    • django后端针对formdata格式类型数据 也会自动解析
    • 但是不会放在request.POST中,而是给你放到了request.FILES中

    Ajax

    • ajax默认的提交数据的编码格式也是urlencoded

    总结:Django后端针对不同的编码格式的数据,会有不用的处理机制以及不同的获取该数据的方法。

    注意

    • 前后端在做数据交互的时候 一定一定要表明你所发的的数据到底是什么格式

    • 你的数据时什么格式 你就应该准确无误告诉别人是什么格式

    序列化组件

    ​ 将用户表的数据 查询出来 返回给前端,给前端的是一个大字典 字典里面的数据的一个个的字段

    from django.core import serializers
        def ser(request):
        user_queryset = models.Userinfo.objects.all()
        # 传统方法:[{},{},{},{}]
        # user_list = []
        # for user_obj in user_queryset:
        #     user_list.append({
        #         'username':user_obj.username,
        #         'password':user_obj.password,
        #         'gender':user_obj.get_gender_display(),
        #     })
        res = serializers.serialize('json',user_queryset)
        print(res)
        return render(request,'ser.html',locals())
    

    综合实例:ajax+sweetalert

    $("#b55").click(function () {
        swal({
            title: "你确定要删除吗?",
            text: "删除可就找不回来了哦!",
            type: "warning",
            showCancelButton: true,  // 是否显示取消按钮
            confirmButtonClass: "btn-danger",  // 确认按钮的样式类
            confirmButtonText: "删除",  // 确认按钮文本
            cancelButtonText: "取消",  // 取消按钮文本
            closeOnConfirm: false,  // 点击确认按钮不关闭弹框
            showLoaderOnConfirm: true  // 显示正在删除的动画效果
        },
             function () {
            var deleteId = 2;
            $.ajax({
                url: "/delete_book/",
                type: "post",
                data: {"id": deleteId},
                success: function (data) {
                    if (data.code === 0) {
                        swal("删除成功!", "你可以准备跑路了!", "success");
                    } else {
                        swal("删除失败", "你可以再尝试一下!", "error")
                    }
                }
            })
        });
    })
    
    """
    当你是用ajax做前后端 交互的时候 
    你可以考虑返回给前端一个大字典
    """
    import time
    from django.http import JsonResponse
    def sweetajax(request):
        if request.method == 'POST':
            back_dic = {"code":1000,'msg':''}
            delete_id = request.POST.get('delete_id')
            models.Userinfo.objects.filter(pk=delete_id).delete()
            back_dic['msg'] = '后端传来的:真的被我删了'
            time.sleep(3)
            return JsonResponse(back_dic)
        user_queryset = models.Userinfo.objects.all()
        return render(request,'sa.html',locals())
    
  • 相关阅读:
    vue1.0
    网络抓包(四)
    物联网框架ServerSuperIO
    Solrcloud(Solr集群)
    机器学习1
    TCP/IP协议族(一)
    ElasticSearch(简称ES)
    工具
    线程本地变量的使用
    Features of Spring Web MVC
  • 原文地址:https://www.cnblogs.com/dadazunzhe/p/11755968.html
Copyright © 2011-2022 走看看