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")
}
}
})
}