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