接下来我将为你详细讲解Django中的Ajax请求的完整攻略,包含两个示例说明。
一、什么是Ajax请求
Ajax是Asynchronous JavaScript and XML的缩写,即使用JavaScript在不重新加载整个页面的情况下异步地与服务器交换数据。Ajax技术使用了XMLHttpRequest对象与服务器进行异步通信,然后使用JavaScript动态地更新页面。
二、Django中实现Ajax请求的步骤
1. 引入jQuery库
在你的Html文件中引入jQuery库,以方便使用jQuery库里的Ajax方法。可以使用从CDN上获取到的jQuery库,也可以将jQuery文件下载放到你的项目中。
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
2. 在Django中设置CSRF Token
在Django中使用POST请求时,需要向服务器发送一个CSRF Token,以确保服务器可以认证请求的合法性。可以使用{% csrf_token %}
模板标签或者手动获取CSRF Token并在请求中发送。
{% csrf_token %}
或者
function getCookie(name) {
// function to get a cookie by name
if (!document.cookie) {
return null;
}
const xsrfCookies = document.cookie.split(';')
.map(c => c.trim())
.filter(c => c.startsWith(name + '='));
if (xsrfCookies.length === 0) {
return null;
}
return decodeURIComponent(xsrfCookies[0].split('=')[1]);
}
const csrftoken = getCookie('csrftoken');
在发送Ajax请求时,需要加上CSRF Token:
$.ajax({
url: '/test',
type: 'POST',
data: {
'name': 'John Doe'
},
headers: {
'X-CSRFToken': csrftoken
},
success: function (data) {
console.log(data);
}
});
3. 编写Django视图函数
在Django中编写视图函数,以处理Ajax请求。Django中视图函数常用的方式是返回Json数据。
from django.http import JsonResponse
def test(request):
if request.method == 'POST':
name = request.POST.get('name')
result = {
'name': name
}
return JsonResponse(result, status=200)
4. 发送Ajax请求
在前端页面上,使用jQuery库中的$.ajax()方法发送Ajax请求。
$.ajax({
url: '/test',
type: 'POST',
data: {
'name': 'John Doe'
},
headers: {
'X-CSRFToken': csrftoken
},
success: function (data) {
console.log(data);
}
});
以上为Django中实现Ajax请求的基本步骤。
三、示例一:实现一个评论功能
接下来,我将通过一个评论功能示例来演示Ajax请求的使用。在这个示例中,我们将使用Ajax请求以异步方式提交表单数据,并使用返回的Json数据更新评论列表。
1. Html模板
在Html模板中添加评论表单和评论列表。
<h2>评论</h2>
<form id="comment-form">
{% csrf_token %}
<div class="form-group">
<label for="comment-text">评论</label>
<textarea class="form-control" id="comment-text" rows="3" name="text"></textarea>
</div>
<button type="submit" class="btn btn-primary">提交</button>
</form>
<ul id="comment-list" class="list-group">
{% for comment in comments %}
<li class="list-group-item">{{ comment.text }}</li>
{% endfor %}
</ul>
2. Django视图函数
在Django视图函数中处理Ajax请求,并返回Json格式的数据。
from django.shortcuts import render
from django.http import JsonResponse
def comment(request):
if request.method == 'POST':
text = request.POST.get('text')
comment = Comment(text=text)
comment.save()
comments = Comment.objects.all()
data = {
'comments': [{'text': comment.text} for comment in comments]
}
return JsonResponse(data, status=200)
comments = Comment.objects.all()
return render(request, 'comment.html', {'comments': comments})
3. Javascript代码
使用jQuery库中的$.ajax()方法处理表单提交,提交成功后更新评论列表。
$(document).ready(function() {
const csrftoken = getCookie('csrftoken');
// 处理评论表单提交
$('#comment-form').submit(function(e) {
e.preventDefault();
const formData = $(this).serializeArray();
const url = $(this).attr('action');
$.ajax({
url: url,
type: 'POST',
data: formData,
headers: {
'X-CSRFToken': csrftoken
},
success: function(data) {
const comments = data.comments;
let html = '';
comments.forEach(function(comment) {
html += `<li class="list-group-item">${comment.text}</li>`;
});
$('#comment-list').html(html);
$('#comment-form')[0].reset(); // 重置表单
}
});
});
// 获取csrf token的函数
function getCookie(name) {
if (!document.cookie) {
return null;
}
const xsrfCookies = document.cookie.split(';')
.map(c => c.trim())
.filter(c => c.startsWith(name + '='));
if (xsrfCookies.length === 0) {
return null;
}
return decodeURIComponent(xsrfCookies[0].split('=')[1]);
}
});
运行示例,在评论表单中输入评论内容并提交,应该可以在评论列表中看到新的评论。
四、示例二:实现一个点赞功能
第二个示例是一个点赞功能示例。在这个示例中,我们当用户点击点赞按钮时,将使用Ajax请求以异步方式提交点赞数据,并使用返回的Json数据更新点赞数。
1. Html模板
在Html模板中添加点赞按钮和点赞数。
<i id="like-btn" class="fa fa-thumbs-up"></i> <span id="like-count">{{ post.like_count }}</span>
2. Django视图函数
在Django视图函数中处理Ajax请求,并返回Json格式的数据。
from django.shortcuts import render
from django.http import JsonResponse
def like(request, post_id):
if request.method == 'POST':
post = Post.objects.get(id=post_id)
post.like_count += 1
post.save()
data = {
'like_count': post.like_count
}
return JsonResponse(data, status=200)
post = Post.objects.get(id=post_id)
return render(request, 'post.html', {'post': post})
3. Javascript代码
使用jQuery库中的$.ajax()方法处理点赞操作,操作成功后更新点赞数。
$(document).ready(function() {
const csrftoken = getCookie('csrftoken');
// 处理点赞按钮点击事件
$('#like-btn').click(function(e) {
e.preventDefault();
const url = $(this).attr('href');
const likeCountElem = $('#like-count');
$.ajax({
url: url,
type: 'POST',
data: {},
headers: {
'X-CSRFToken': csrftoken
},
success: function(data) {
likeCountElem.text(data.like_count);
}
});
});
// 获取csrf token的函数
function getCookie(name) {
if (!document.cookie) {
return null;
}
const xsrfCookies = document.cookie.split(';')
.map(c => c.trim())
.filter(c => c.startsWith(name + '='));
if (xsrfCookies.length === 0) {
return null;
}
return decodeURIComponent(xsrfCookies[0].split('=')[1]);
}
});
运行示例,在点赞按钮上点击,应该会看到点赞数的增加。这个示例同样可以用来作为其他类型的计数器,比如收藏数等等。
至此,Django中实现Ajax请求的完整攻略已经讲解完毕。如果你有其他问题,可以继续问我。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中的ajax请求 - Python技术站