choice参数、MTV与MVC模型、Ajax
choice参数
choice 参数应用场景 用户性别 用户学历 用户工作状态 客户来源 ... 示例: choices = ( (1,'male'), (2,'female'), ) gender = models.IntegerField(choices=choices) # 就是把你想要的选择先写出来,放在一个对应的元祖里,优点就是使用起来更方便,减少代码冗余. # 调用的方法: from app01 import models user_obj = models.Userinfo.object.filter(pk=4).first() print(user_obj.username) print(user_obj.gender) #错误语法 # 针对choices字段 如果你想要获取数字所对应的中文,你不能直接点字段 # 固定句式 数据对象.get_字段名_display() 当没有对应关系的时候,该句式获取到的还是数字 print(user_obj.get_gender_display()) 更多应用场景: record_choices = ( ('checked', "已签到"), ('vacate', "请假"), ('late', "迟到"), ('noshow', "缺勤"), ('leave_early', "早退"), #你当然也不用非要用数字代替,其他的对应也可以 ) record = models.CharField("上课记录", choices=record_choices, default="checked") # 括号里的choices就等于你自己写的对应关系, 当然你也可以设置默认值. 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)
MTV与MVC模型(了解)
django号称是MTV框架,其实他还是MVC框架 MTV: M: models T: templtes v: views MVC: M: models V: views C: contronner(路由配置)
Ajax
同步异步: 同步:提交任务之后,原地等待任务的返回结果,期间不做其他的事情 异步:提交任务之后,不原地等待,直接执行下一个,任务的返回通过回调机制 阻塞非阻塞: 描述的程序的运行状态: 就绪--运行--阻塞 局部刷新: 表示一个页面,不是整体刷新,而是页面的某个地方局部刷新 Ajax是一门js的技术,是基于js开发的,但是用原生的js写代码的过于繁杂,我们用JQuery实现ajax Ajax最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容. (这一特点给用户的感受是在不知不觉中完成请求和响过程)
Ajax示例
1.展示一个前端页面,页面上有三个输入框, 前两个输入数字,点击按钮朝后端发送请求,在页面不刷新的情况下载第三个框显示前两个相加的结果. eg: <input type='text' id='t1'>+<input type='text' id='t2'>=<input type='text' id='t3'> <p><button id='b1'>计算</button></p> # 在按钮上触发点击事件. $('#b1').on('click', function(){ // 朝后端提交post数据,写ajax $.ajax({ // 1.往哪个地址发送数据 url:'', //不写的话就默认当请地址 // 2.请求的格式 type:'post', //专门定制ajax发送的请求方式. // 3.发送什么数据 data:{'t1':$('#t1').val(), 't2':$('#t2').val()}, 获取前两个输入框输入的内容 // 4.异步提交的任务, 需要通过回调函数来处理 success:function (data){ //data形参指代的就是异步提交的返回结果} // 通过DOM操作将内容渲染到标签内容上 $('#t3').val(data) // ,这里写data就是最后结果. }) } def index(request): if request.is_ajax(): # 判断当前的请求是否是ajax,然后在判断是否是post请求.然后做逻辑处理.让获取到的两个数字相加. res的结果经过ajax的处理会直接展示在第三个框里. if request.method == 'POST': t1 = request.POST.get('t1') t2 = request.POST.get('t2') res = int(t1) + int(t2) return HttpResponse(res)
Ajax传json格式的数据
django后端针对json格式的数据,不会自动的帮你解析.会原封不动的给你放到request.body中,你可以手动处理,获取数据. 后端手动处理 json_bytes = request.body #拿到jsoon格式数据,是二进制的 json_str = str(json_bytes, encoding='utf8') # 转成utf8格式 json_dict = json.loads(json_str) #拿到数据 #注意点: 1.指定contentType参数 contentType: 'application/json', 传送json格式 2.你要发送的数据也要确保是json格式的,确保一致. data:JSON.stringify({'username':'kang','password':'123'})
Ajax传文件
# ajax传文件需要利用内置对象 Formdata,该对象既可以传文件也可以传普通的键值 # 获取input用户上传文件的文件的内容. 1.先通过jquery查找到该标签 $('$t3') 2.将jquery对象转换成原生的js对象$('$t3')[0] 3.利用原生js对象的方法, 来直接获取文件的内容$('$t3')[0].files[0] $('$t3')[0].files[0] 示例: $('#b1').on('click', function(){ // 1.先生成一个formdata对象 var myForData = new FormData(); // 2.朝对象中添加普通的键值 myForData.append('username', $("#t1").val()); myForData.append('paasword', $("#t2").val()); } // 3.朝对象中添加文件数据 1.先通过jquery查找该标签 2.将jquery对象转换成原生js对象 3.利用原生js对象的方法,直接获取文件内容. myForData.append('myfile',$('#t3')[0].files[0]); $.ajax({ url:'', type:'post', data:myForData, // 直接丢对象. // ajax传文件, 一定要指定两个关键性的参数 contentType:false, // 不用任何编码 因为formdata对象自带编码,django能够识别对象. processData:false, // 告诉浏览器不要处理我的数据, 直接发就行. success:function (data) { alert(data) } }) }) ajax文件需要注意的事项. 1.利用formdata对象 能够简单的快速传输数据(普通键值 + 文件) 2.有几个参数 data: formdata对象 contentType:false processData:false
contentType前后端传输数据编码格式
form表单 默认的提交数据的编码格式是urlencoded urlencoded 1.username=admin&password=123这种就是符合urlencoded数据格式. 2.django后端针对username=admin&password=123的数据格式会自定解析将结果打包给rquest.POST 用户只需要从request.POST即可获取对应的信息. formdata 1.django后端针对formdata格式类型数据,也会自动解析 2.但是不会针对request.POST中而是给你放到了request.FILES中 总结: django后端针对不同的编码格式,会有不同的处理机制以及不同的获取该数据的方法.
注意:前后端在做数据交互的时候,一定一定要表名你所发的数据格式到底是什么格式. 序列化组件 1.将用户表的数据 查询出来, 返回给前端(给前端的是一个大字典, 字典里的数据的一个个字段) from django.core import serializers #导入此模块可以直接把数据转成json类型 def ser(request): user_queryset = models.Userinfo.object.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) #变为json类型 return render(request, 'ser.html', local()) #发送到前端.
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") } } }) }