在 Django 中使用 AJAX/jQuery 删除对象是一种常见的 Web 开发模式,它允许在不刷新整个页面的情况下从数据库中删除记录。这种方法提高了用户体验,使交互更加流畅。
首先需要在 Django 中创建一个视图来处理删除请求:
# views.py
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.views.decorators.csrf import csrf_exempt
from .models import YourModel # 替换为你的模型
@require_POST
@csrf_exempt # 如果使用CSRF token,可以去掉这个装饰器
def delete_object(request, pk):
try:
obj = YourModel.objects.get(pk=pk)
obj.delete()
return JsonResponse({'status': 'success'})
except YourModel.DoesNotExist:
return JsonResponse({'status': 'error', 'message': 'Object not found'}, status=404)
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('delete/<int:pk>/', views.delete_object, name='delete_object'),
]
// 假设每个删除按钮都有一个类名 'delete-btn' 和数据属性 'data-id'
$(document).on('click', '.delete-btn', function(e) {
e.preventDefault();
var objectId = $(this).data('id');
var deleteUrl = '/delete/' + objectId + '/'; // 替换为你的URL
if (confirm('确定要删除这个项目吗?')) {
$.ajax({
url: deleteUrl,
type: 'POST',
data: {
'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()
},
success: function(response) {
if (response.status === 'success') {
// 从DOM中移除已删除的元素
$(e.target).closest('tr').fadeOut(300, function() {
$(this).remove();
});
// 或者刷新部分页面内容
// location.reload();
} else {
alert('删除失败: ' + response.message);
}
},
error: function(xhr, errmsg, err) {
alert('发生错误: ' + errmsg);
}
});
}
});
原因:Django默认要求POST请求包含CSRF token
解决方案:
@csrf_exempt
装饰器(不推荐生产环境使用)原因:尝试删除不存在的对象
解决方案:
DoesNotExist
异常并返回适当的响应原因:AJAX成功回调中没有更新DOM
解决方案:
HTML模板示例:
{% load static %}
<!DOCTYPE html>
<html>
<head>
<title>AJAX删除示例</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<table>
{% for obj in objects %}
<tr>
<td>{{ obj.name }}</td>
<td>
<button class="delete-btn" data-id="{{ obj.id }}">删除</button>
</td>
</tr>
{% endfor %}
</table>
{% csrf_token %}
<script src="{% static 'js/delete_script.js' %}"></script>
</body>
</html>
这个实现提供了完整的Django AJAX删除功能,包括前端和后端代码,以及常见问题的解决方案。