• django之choice、ajax初步


    django之choice参数,ajax

    choice参数

    应用场景:主要是用户性别、用户工作状态、成绩对应

    ##在测试文件中运行,需要写以下几个模块
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day62.settings")
        import django
        django.setup()
    
    
    choices = (
    	
        (1, 'male'),
        (2, 'female'),
        (3, 'others')
    )
    gender = models.IntegerField(choices=choices)
    
    ##注意:
    """
    针对choices字段,如果想拿到数字所对应的的中文或者其他值 不能直接点字段
    固定句式	数据对象.get_字段名_display()
    """
    
    执行下面两种语句
    from app01 import models
    
    
    #1.
    user_obj = models.Userinfo.objects.filter(pk=2).first()
    print(user_obj.username)
    print(user_obj.gender)
    print(user_obj.get_gender_display())
    '''
    #会打印出来
    nick
    1
    male
    #这样存在值的话,就会把元组中数字对应的信息(比如这里的 male 打印出来)
    '''
    
    
    #2.
    user_obj = models.Userinfo.objects.filter(pk=4).first()
    print(user_obj.username)
    print(user_obj.gender)
    print(user_obj.get_gender_display())
    '''
    #会打印出来
    michael
    4
    4
    #这样不存在值的话,即没有对应关系,就会把数字打印出来
    '''
    
    
    
    
    
    #此外,还有以下几个常用的应用场景
    
    #A
            record_choices = (('checked', "已签到"),
                          ('vacate', "请假"),
                          ('late', "迟到"),
                          ('noshow', "缺勤"),
                          ('leave_early', "早退"),
                          )
            record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length = 32)
        
        
            
    #B 
            score_choices = ((100, 'A+'),
                         (90, 'A'),
                         (85, 'B+'),
                         (80, 'B'),
                         (70, 'B-'),
                         (60, 'C+'),
                         (50, 'C'),
                         (40, 'C-'),
                         (0, ' D'),
                         (-1, 'N/A'),
                         (-100, 'COPY'),
                         (-1000, 'FAIL'),
                         )
            score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
    

    Ajax

    1. 异步提交和局部刷新

    异步提交就是说,提交任务之后,不会原地等待,直接执行下一行代码,任务的返回通过回调机制

    局部刷新,一个页面不是整体刷新,而是页面的某个地方局部刷新,比如,注册账号时,输入字母,就会判断当前账号是否被注册,但是页面却没有被刷新

    2.Ajax 几个小需求(计算器,传json格式,传文件)

    """
    Ajax是一门js的技术  基于原生js开发的,但是用原生的js写代码过于繁琐,需要用jq实现ajax的使用
            
    Ajax 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
            (这一特点给用户的感受是在不知不觉中完成请求和响应过程)
    """
    
    
    
    ## 需求一:
    '''
    1.展示一个前端页面  页面上有三个输入框  前两个框输入数字 点击按钮朝后端发请求页面不刷新的情况下 完成数字的加法运算 
    '''
    
    #这种情况下的Content-Type: application/x-www-form-urlencoded;就是普通的POST请求内容类型
    #form data(表单数据):username=jason&password=123
    
    
    #前端页面
    
    <input type="text" id="t1"> + <input type="text" id="t2"> = <input type="text" id="t3">
    <p>
        <button id="b1">计算</button>
    </p>
    <script>
    	$('#b1').on('click', function(){
            # 朝后端提交post数据
            $.ajax({
                #1.到底朝后端哪个地址发数据
                url:'',#专门用来控制朝后端提交数据的地址  不写默认就是朝当前地址提交
                #2.到底发送什么请求
                type:'post', #专门制定ajax发送的请求方式
                #3.发送的数据到底是什么
                data:{'t1':$('#t1').val(), 't2':$('#t2').val()},
                #4.异步提交的任务 需要通过回调函数来处理
                success:function(data){ #data形参指代的就是异步提交的返回结果
                    #通过DOM操作,将内容渲染到标签内容上
                    $('#t3').val(data)
                    alert(data)    
    
                }
            })
        })
    </script>
    
    #后端页面
    def index(request):
        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, 'index.html')
    
    
    
    ##需求二:json格式
    '''
    django后端针对json格式的数据 不会自动帮你解析 会直接原封不动的给你放到request.body中
    可以手动处理 获取数据
    '''
    
    #这种情况下的Content-Type: application/json,告诉后端是json格式的数据类型
    #form data 表单数据:json字符串{"username":"jason","password":"123"}
    
    #前端
    <p>
        <button id="b1">计算</button>
    </p>
    <script>
    	$("#bt").on('click', function(){
            $.ajax({
                url: '',
                type: 'post',
                contentType: 'application/json',
                data: JSON.stringify({
                    'username': 'jason',
                    'password': '123'
                })
                success: function(data){
                    $('#t3').val(data)
                }
            })
        })
    </script>
    
    #后端
    import json
    def index(request):
        if request.is_ajax():
            if request.method == 'POST':
                json_bytes = request.body
                json_str = str(json_bytes, encoding='utf8')
                json_dirt = json.loads(json_str)
                print(json_dirt, type(json_dirt))
    
        return render(request, 'index.html')
    
    
    
    ##需求三:传文件
    """
    注意点:需要利用内置对象 Formdata,该对象既可以传普通的键值,也可以传文件
    """
    
    #获取Input中用户上传文件的文件内容
    
    
    
    #前端body中的部分代码:
    
    <input type="text" name="username" id="t1">
    <input type="text" name="password" id="t2">
    <input type="file" name="myfile" id="t3">
    <button id="b1">提交</button>
    
    
    $('b1').click(function(){
        #1.先生成一个formdata对象
        var myFormData = new FormData();
        #2.朝对象中添加普通的键值(第一个参数是 name 字符串,就是key ,第二个参数是对应的值, 就是value)
        myFormData.append('username', $("#t1").val());
        myFormData.append('password', $("#t2").val());
        #3.朝对象中添加文件数据
        ##1.先通过jquery查找到该标签(即$("#t3"),通过id找到该标签)
        ##2.将jquery对象转换成原生的js对象(上一步拿到的是列表套对象,然后索引0,取到js对象)
        ##3.利用原生js对象的方法 直接获取文件内容(上一步通过js对象,直接.files,拿到列表索引取第一个值)
        myFormData.append('myfile', $('#t3')[0].files[0]);
    	$.ajax({
            url: '',
            type: 'post',
            data: myFormData,#直接丢对象
            #ajax传文件 一定要指定两个关键性的参数
            contentType:false, # 不用任何编码,因为formdata对象自带编码, django能够识别该对象
            processData:false, # 告诉浏览器不要处理我的数据 直接发就行
            success:function(data){
                alert(data)
            }
        })
    })
    
    
    #后端代码
    
    def upload(request):
        if request.is_ajax():
            if request.method == "POST":
    			print(request.FILES)
                return HttpResponse('已接收')
        return render(request, 'upload.html')
    
    
    
    """
    ajax传文件需要注意的事项
    	
    	1.利用formdata对象 能够简单的快速传输数据(普通键值 + 文件)
    	
    	2.有几个参数:
    		data:formdata对象
    		
    		contentType: false,
    		processData: false,
    """
    

    3. 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
           username=jason&password=123
                
           总结:django后端针对不同的编码格式数据 会有不同的处理机制以及不同的获取该数据的方法(所以在进行前后端交互的时候,应该将传过去的数据格式告诉前端)
    '''
    

    4.序列化组件

    '''
    1.将用户表的数据 查询出来 返回给前端, 给前端的是一个大字典 字典里面的数据的一个个的字段
    '''
    
    #后端
    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())
        
        
    #前端(只需要用模板语法把res拿到就好了)
    <body>
    	{{ res }}
    </body>
    

    5.ajax+sweetalert的小案例

    ## 前端代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
        {% load static %}
        <link rel="stylesheet" href="{% static 'dist/sweetalert.css' %}">
        <script src="{% static 'dist/sweetalert.min.js' %}"></script>
        <style>
            div.sweet-alert h2 {
                padding-top: 10px;
            }
        </style>
    </head>
    <body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <h2>数据展示</h2>
                <table class="table table-hover table-striped table-bordered">
                    <thead>
                        <tr>
                            <th>序号</th>
                            <th>用户名</th>
                            <th>密码</th>
                            <th>性别</th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for user_obj in user_queryset %}
                            <tr>
                                <td>{{ forloop.counter }}</td>
                                <td>{{ user_obj.username }}</td>
                                <td>{{ user_obj.password }}</td>
                                <td>{{ user_obj.get_gender_display }}</td>
                                <td>
                                    <a href="#" class="btn btn-primary btn-sm">编辑</a>
                                    <a href="#" class="btn btn-danger btn-sm cancel" delete_id="{{ user_obj.pk }}">删除</a>
                                </td>
                            </tr>
                        {% endfor %}
                    </tbody>
    
    
                </table>
            </div>
        </div>
    </div>
    
    
    <script>
        $('.cancel').click(function () {
            var $btn = $(this);
            swal({
              title: "你确定要删吗?",
              text: "你要是删了,你就准备好跑路吧!",
              type: "warning",
              showCancelButton: true,
              confirmButtonClass: "btn-danger",
              confirmButtonText: "对,老子就要删!",
              cancelButtonText: "算了,算了!",
              closeOnConfirm: false,
                showLoaderOnConfirm: true
            },
            function(){
                $.ajax({
                    url:'',
                    type:'post',
                    data:{'delete_id':$btn.attr('delete_id')},
                    success:function (data) {
                        if (data.code==1000){
                            swal(data.msg, "你可以回去收拾行李跑路了.", "success");
                            // 1.直接刷新页面
                            {#window.location.reload()#}
                            // 2.通过DOM操作 实时删除
                            $btn.parent().parent().remove()
                        }else{
                            swal("发生了未知错误!", "我也不知道哪里错了.", "info");
                        }
                    }
                });
    
            });
        })
    </script>
    
    
    </body>
    </html>
            
            
            
    
    ##后端代码
      
    """
    当你是用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())      
    
    
  • 相关阅读:
    如何使用git提交代码
    Eclipse升级ADT
    android学习:android开发常见技巧设置,提高开发效率
    Apache -Common-lang包使用
    最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
    Asp.Net MVC entity framework模型验证
    Activity启动模式
    http服务器交互get,put,post,delete等说明
    js模块化插件开发
    Android Asynchronous Http Client异步网络请求使用
  • 原文地址:https://www.cnblogs.com/michealjy/p/11756190.html
Copyright © 2020-2023  润新知