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