一、Django与Ajax
参考博客:博客园-JSONJi,原文链接:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
Ajax,Asynchronous Javascript And XML,即异步的JS和XML,一种使用现有标准的新方法。
Ajax最大的特点就是在不重载整个页面的情况下,与服务器交换数据并刷新局部内容!比如我们在各大网站平台登录注册时,当输入有误时会有红色错误信息提示而不需要整个页面刷新,这就是运用到了Ajax技术。
朝后端发起请求的方式
- 浏览器输入url访问:get请求。
- a标签href属性:get请求。
- form表单:get/post请求
- Ajax
Ajax我们只学习jQuery封装之后的版本,不学原生的,因为原生的比较复杂,所以我们要在HTML里导入jQuery!
1.1、MTV与MVC模型
MTV
Django号称是MTV模型;M即models、T即templates、v即views;其实Django本质也是MVC!
MVC
M还是models;V即views; C即controller(urls.py)
MVVM
Vue框架的概念,后面学到再了解即可。
1.2、Ajax操作(重点)
Ajax基本使用
urls代码
urlpatterns = [
url(r'Ajax_test', views.Ajax_test)
]
views代码
def Ajax_test(request):
if request.method == 'POST':
return HttpResponse('收到了')
return render(request, 'Ajax_test.html')
HTML代码
<body>
<form action="" method="post">
<p>username:<input type="text" id="i1" name="username"></p>
<p>password:<input type="password" id="i2" name="password"></p>
<input type="submit" value="提交" id="i3">
</form>
<script>
$('#i3').on('click', function Ajax_func(){
// 朝后端发起Ajax请求
$.Ajax({
// 指定后端地址
url:'', // 不写则默认朝当前地址提交
type: 'POST', // 不指定则默认为get,大小写均可。
data: {'username': $('#i1').val(), 'password': $('#i2').val()}, // 提交的数据
success: function(args){ // success为回调函数,参数即后端给你返回的数据.
alert(args)
}
})
})
</script>
</body>
前后端传输数据编码格式
在Request Headers里面Content-Type可以看到格式的类型
Content-Type: application/x-www-form-urlencoded
主要有三种:
- urlencoded
- form-data
- JSON
form表单无法发送JSON格式数据,它默认数据编码格式为urlencoded,而Django后端针对符合urlencoded编码格式的数据都会自动帮你解析并封装到request.POST中;如果把编码格式改成form-data,那么针对普通的键值对还是解析到request.POST,而将文件解析到request.FILES中,这是对WSGI的二次封装。
Ajax发送JSON格式数据
Ajax默认也是urlencoded格式,在前后端传输数据的时候,一定要确保编码格式跟数据真正的格式是一致的,即用contentType更改格式后,也要把发送过去的数据变成对应格式才是一致
<body>
<form action="" method="post" enctype="multipart/form-data">
<p>username:<input type="text" id="i1" name="username"></p>
<p>password:<input type="password" id="i2" name="password"></p>
<input type="submit" value="提交" id="i3">
</form>
<script>
$('#i3').on('click', function ajax_func(){
// 朝后端发起ajax请求
$.ajax({
// 指定后端地址
url:'', // 不写则默认朝当前地址提交
type: 'POST', // 不指定则默认为get,大小写均可。
contentType: 'application/json',
data: JSON.stringify({'username': $('#i1').val(), 'password': $('#i2').val()}), // 提交的数据
success: function(args){
alert(args)
}
})
})
</script>
</body>
request对象方法补充
Django后端不会处理JSON格式的数据,需要我们用is_ajax判断后自己手动处理它
views代码
def ajax_test(request):
if request.method == 'POST':
if request.is_ajax: # 判断是否为ajax类型
json_data = request.body # 请求体内容
decode_data = json.loads(json_data) # 括号内如为二进制格式,则自动解码再反序列化。
print(decode_data)
return render(request, 'ajax_test.html')
# 执行结果
{'username': 'sanxi', 'password': 666}
HTML代码
<body>
<input type="submit" value="提交" id="i3">
<script>
$('#i3').on('click', function ajax_func(){
$.ajax({
url:'',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({'username': 'sanxi', 'password': 666}),
success: function(args){
console.log(args)
}
})
})
</script>
</body>
Ajax发送JSON格式数据注意事项:
1、contentType参数指定成:application/json
2、发送的数据一定要是真正的JSON格式数据
3、Django后端不会帮你处理JSON格式数据,要自己去request.body获取并处理
Ajax发送文件
Ajax发送文件需要借助于JS内置对象formdata
<body>
<p>username:<input type="text" id="i1" name="username"></p>
<p>password:<input type="password" name="password" id="i2"></p>
<p><input type="file" name="files" id="i3"></p>
<p><input type="submit" value="提交" id="i4"></p>
<script>
$('#i4').on('click', function ajax_func(){
let formDataObj = new FormData(); // 利用FormData创建对象
formDataObj.append('username', $('#i1').val()); // 追加普通键值对数据
formDataObj.append('password', $('#i2').val());
formDataObj.append('files', $('#i3')[0].files[0]) // 追加文件对象
// 朝后端发起ajax请求
$.ajax({
url:'', // 不写则默认朝当前地址提交
type: 'POST', // 不指定则默认为get,大小写均可。
contentType: false, // 不用指定编码,Django可自动识别FormData对象。
processData: false, // 通知浏览器不要对数据进行任何处理
data: formDataObj, // 直接将FormData对象放这
success: function(args){
console.log(args)
}
})
})
</script>
</body>
views代码
def ajax_test(request):
if request.method == 'POST':
if request.is_ajax:
print(request.POST)
print(request.FILES)
return render(request, 'ajax_test.html')
Ajax发送文件总结:
1、需要利用内置的对象formdata
2、需要指定两个关键性参数
3、Django后端能够直接识别到formdata对象并且能够将内部的普通键值对自动解析并封装到request.POST中,文件数据自动解析并封装到request.FILES中
1.3、Django自带的序列化
实际项目中前后端分离是很常见的,所以我们后端处理好数据只要能序列化返回给前端即可,然后写个接口文档给前端说明都是些什么意思,一般都是处理成列表套字典形式,因为它是公共形式。
所谓的写接口,就是处理好数据后写文档交代。
案例演示
views代码
from django.shortcuts import render, HttpResponse
from django.db import models
from study import models
from django.core import serializers # 需要先导入这个模块
# Create your views here.
def ajax_test(request):
user_obj = models.UserInfo.objects.all()
json_obj = serializers.serialize('json', user_obj) # 第一个参数定义格式,第二个直接扔数据对象,Django会自动处理。
return render(request, 'json_info.html', locals())
HTML代码
没错,就是一行
<body>
{{ json_obj }}
</body>
执行结果,
页面显示,超级详细!!!
[{"model": "study.userinfo", "pk": 1, "fields": {"name": "sanxi", "gender": 1}},
{"model": "study.userinfo", "pk": 2, "fields": {"name": "chrystal", "gender": 2}},
{"model": "study.userinfo", "pk": 3, "fields": {"name": "haha", "gender": 3}}]
二、自定义分页器
当我们需要使用到非Django内置的第三方功能或者组件代码的时候,一般会创建一个名为utils文件夹,在该文件夹内对模块进行功能性划分,utils可以在每个应用下创建,具体结合实际情况。
参考博客:JsonJi,原文链接:https://www.cnblogs.com/Dominic-Ji/articles/12035722.html