Ajax实现计算小案例;Ajax数据格式化;Ajax发送json格式的数据;Ajax上传文件;Ajax结合layer组件实现删除的二次确认 # day57

Ajax的小案例

需求:

1+1=2

前提:不需要刷新页面也能显示出来

实现:

views.py

from django.shortcuts import render, HttpResponse

# Create your views here.

def index(request):
print(request.POST)
# if request.method == 'POST'
if request.is_ajax(): # 判断是否使用Ajax
d1 = request.POST.get('d1')
d2 = request.POST.get('d2')

d3 = int(d1) + int(d2) # 此时拿到的d1,d2数据类型是字符串形式
return HttpResponse(d3)
return render(request, 'index.html')

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<input type="text" id="d1">
+
<input type="text" id="d2">
=
<input type="text" id="d3">

<button class="btn btn-success">计算</button>

<script>
// 要想使用Ajax,必先引入jQuery
$('.btn').click(function () {
var d1 = $('#d1').val()
var d2 = $('#d2').val()
$.ajax({
// 1、指定数据提交的路径
url:'/index/', // 引号内不写,默认为当前路由

// 2、指定提交方式
type:'post',

// 3、传入的数据
data:{'d1':d1, 'd2':d2},

// 4、接收后端返回的结果(创建一个匿名函数来接收数据),当后端返回结果的时候,触发执行
success:function (res) {
{#alert(res)#}
$('#d3').val(res)
}
})
})
</script>
</body>
</html>

扩展:在页面中显示的效果如何实时显示结果?(提示:键盘事件)

 

Ajax数据格式化

views.py

from django.shortcuts import render, HttpResponse

# Create your views here.
import json
from django.http import JsonResponse
def index(request):
print(request.POST)
# if request.method == 'POST'
if request.is_ajax(): # 判断是否使用Ajax
back_dic = {'code': 200, 'msg': '请求成功', 'data': {'username': 'yuziqi'}}
# d1 = request.POST.get('d1')
# d2 = request.POST.get('d2')

# d3 = int(d1) + int(d2) # 此时拿到的d1,d2数据类型是字符串形式
return HttpResponse(json.dumps(back_dic))
# return JsonResponse(back_dic)

return render(request, 'index.html')

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<input type="text" id="d1">
+
<input type="text" id="d2">
=
<input type="text" id="d3">

<button class="btn btn-success">计算</button>

<script>
// 要想使用Ajax,必先引入jQuery
$('.btn').click(function () {
var d1 = $('#d1').val()
var d2 = $('#d2').val()
$.ajax({
// 1、指定数据提交的路径
url:'/index/', // 引号内不写,默认为当前路由

// 2、指定提交方式
type:'post',

// 3、传入的数据
data:{'d1':d1, 'd2':d2},
dataType:'json',

// 4、接收后端返回的结果(创建一个匿名函数来接收数据),当后端返回结果的时候,触发执行
success:function (res) {
{#alert(res)#}
{#console.log(typeof res)#}
{#$('#d3').val(res)#}
console.log(typeof res)
// 反序列化
{#res = JSON.parse(res)#}
if (res.code == 200) {
console.log(res.msg)
console.log(res.data)
console.log(res.data.username)
} else {
alert(res.msg)
}
}
})
})
</script>
</body>
</html>

总结:

  什么时候前端需要反序列化?

    1、return HttpResponse(json.dumps(back_dic))

 

  什么时候前端不需要反序列化

    1、return JsonResponse(back_dic)

    2、在传入数据中增加一个约束条件(传入数据类型为json格式)

      $.ajax({

        dataType:'json',

    })

Ajax发送json格式的数据

view.py

from django.shortcuts import render, HttpResponse
import json
from django.http import JsonResponse
def index(request):
print(request.POST) # 只能拿post请求方式的数据, 但是除文件数据,还有json格式的数据也拿不到
"""
如何拿到json数据?
"""
# b'{"d1":"1","d2":"1"}' bytes
print(request.body) # json格式的数据在body中
if request.is_ajax(): # 判断是否使用Ajax
# back_dic = {'code': 200, 'msg': '请求成功', 'data': {'username': 'yuziqi'}}
"""
处理json格式的数据
"""
# b'{"d1":"1","d2":"1"}' bytes
json_bytes = request.body
json_str = json_bytes.decode('utf-8')
print(json_str)

json_data = json.loads(json_str)
print(type(json_data))
d1 = json_data.get('d1')
d2 = json_data.get('d2')
d3 = int(d1) + int(d2)
return HttpResponse(d3)
return render(request, 'index.html')

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<input type="text" id="d1">
+
<input type="text" id="d2">
=
<input type="text" id="d3">

<button class="btn btn-success">计算</button>

<script>
// 要想使用Ajax,必先引入jQuery
$('.btn').click(function () {
var d1 = $('#d1').val()
var d2 = $('#d2').val()
$.ajax({
// 1、指定数据提交的路径
url:'/index/', // 引号内不写,默认为当前路由

// 2、指定提交方式
type:'post',

// 3、传入的数据
data:JSON.stringify({'d1':d1, 'd2':d2}),
contentType:'application/json',

// 4、接收后端返回的结果(创建一个匿名函数来接收数据),当后端返回结果的时候,触发执行
success:function (res) {
$('#d3').val(res)
console.log(typeof res)
// 反序列化
{#res = JSON.parse(res)#}
if (res.code == 200) {

} else {
alert(res.msg)
}
}
})
})
</script>
</body>
</html>

总结:

  Ajax发送json格式的数据需要在前端Ajax传入数据中,用以下方式传入,在views.py中用request.body接收json数据格式。

     data:JSON.stringify({'d1':d1, 'd2':d2}),
contentType:'application/json',

Ajax上传文件

view.py

def upload_file(request):
if request.is_ajax():
print(request.POST) # <QueryDict: {'d1': ['123']}>
print(request.FILES) # <MultiValueDict: {'d2': [<InMemoryUploadedFile: 6.16嫦娥奔月.jpg (image/jpeg)>]}>
return render(request, 'file.html')

file.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<input type="text", id="d1">
<input type="file", id="d2">

<button class="btn-success btn">上传</button>
<script>
console.log($('#d2'))
console.log($('#d2')[0])
console.log($('#d2')[0].files)
console.log($('#d2')[0].files[0])
// 要想使用Ajax,必先引入jQuery
$('.btn').click(function () {

var d1 = $('#d1').val()
var formDataobj = new FormData()
// 1、添加普通数据
formDataobj.append('d1', d1)

// 2、添加文件数据
formDataobj.append('d2', $('#d2')[0].files[0])

$.ajax({
// 1、指定数据提交的路径
url:'', // 引号内不写,默认为当前路由

// 2、指定提交方式
type:'post',

// 3、传入的数据
data:formDataobj, // django会自动识别FormDate对象的数据
{#dataType:'json',#}

// 用FormData对象有两个必须制定的参数
contentType:false, // 不指定编码格式
processData: false, // 告诉浏览器不要处理我的数据

// 4、接收后端返回的结果(创建一个匿名函数来接收数据),当后端返回结果的时候,触发执行
success:function (res) {

}
})
})
</script>
</body>
</html>

Ajax结合layer组件实现删除的二次确认

veiws.py

def userlist(request):
userlist = models.User.objects.all()
if request.is_ajax():
back_dic = {'code':200, 'msg':'删除成功'}
id = request.POST.get('id')
print(type(id))
models.User.objects.filter(pk=id).delete()
return JsonResponse(back_dic)
return render(request, 'userlist.html', locals())

userlist.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
{% load static %}
<script src="{% static 'layer-v3.5.1/layer-v3.5.1/layer/layer.js' %}"></script>
</head>
<body>
<div class="container-fluid">
<div class="row">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>ID</th>
<th>username</th>
<th>password</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in userlist %}
<tr>
<td>{{ obj.id }}</td>
<td>{{ obj.username }}</td>
<td>{{ obj.password }}</td>
<td>
<a href="javascript:;" class="btn btn-danger del" del_id="{{ obj.id }}"
id="del_{{ obj.id }}">删除</a>
</td>
</tr>
{% endfor %}

</tbody>
</table>
</div>
</div>

<script>

{#layer.msg('hello');#}

//询问框
$('.del').click(function () {
var id = $(this).attr('del_id')
{#alert(id)#}
var curretnBtn = $(this)
layer.confirm('你确定删除吗?', {
btn: ['确定'] //按钮
}, function () {
{#layer.msg('这里是确定', {icon: 1});#}
$.ajax({
// 1. 指定数据提交的路径
url: '',

// 2. 指定提交方式
type: 'post',

// 3. 传入的数据
data: {'id':id}, // django会自动识别FormData对象的数据
{#dataType: 'json',#}

// 用FormData对象有两个必须制定的参数
{#contentType: false, // 不指定编码格式#}
{#processData: false, // 告诉浏览器不要处理我的数据#}

// 4. 接收后端返回的结果, 当后盾返回结果的时候,触发执行
success: function (res) {
if (res.code == 200 ) {
{% comment %}layer.msg(res.msg, {icon:2}, function () {
location.reload()
}){% endcomment %}

layer.msg(res.msg, {icon:1})
{#$(this).parent().parent().remove()#}
curretnBtn.parent().parent().remove()

} else {
layer.msg(res.msg)
}
}
})
})
})
</script>
</body>
</html>

 

posted @ 2021-08-18 21:46  Gnomeshghy  阅读(111)  评论(0)    收藏  举报