django之choiceajax初步

Posted Micheal_L

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django之choiceajax初步相关的知识,希望对你有一定的参考价值。

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

以上是关于django之choiceajax初步的主要内容,如果未能解决你的问题,请参考以下文章

Django之权限管理

如何在 Django Summernote 中显示编程片段的代码块?

初步学习Django-第三篇:URLS.PY文件详解

Nginx+uWSGI启动Django

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段