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())
posted @ 2019-10-28 22:19  SweetJack  阅读(206)  评论(0编辑  收藏  举报