You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AJAX成功函数失效:向Django传数据后页面未重载

问题分析与解决方案

你的后端功能正常说明数据已成功处理,但AJAX的success回调没触发,大概率是后端的响应没有正确返回给前端,或者前端未接收到预期响应。下面是具体排查和修复步骤:

1. 修复Django版本兼容问题(关键)

从Django 3.1开始,request.is_ajax()方法已被弃用——它原本依赖X-Requested-With: XMLHttpRequest请求头判断AJAX请求,但新版本中该方法被移除了。如果你的Django版本≥3.1,request.is_ajax()会一直返回False,导致后端不会执行return HttpResponse('done!'),前端自然无法触发success回调。

修改后端views.py代码:

替换request.is_ajax()的判断逻辑,手动检查请求头,同时优化响应逻辑:

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import your_app.models as models  # 确保模型导入路径正确

# 可以去掉@csrf_exempt,因为前端已传递合法CSRF Token
def mydef(request):
    if request.method == 'POST':
        # 替换is_ajax(),手动验证AJAX请求头
        if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            id_list = request.POST.getlist('id_list[]')
            for item in id_list:
                obj = models.users.objects.get(id=item)
                obj.Status = '1'
                obj.save()
            return HttpResponse('done!')
        # 增加默认返回,避免无响应导致前端报错
        return HttpResponse('invalid request type')
    return HttpResponse('method not allowed')

2. 优化前端AJAX配置

给AJAX请求添加响应类型声明,同时增加错误回调方便调试:

$(document).ready(function(){
    $('#accept_all').click(function(){
        var id_list = [];
        $('#table input:checked').each(function() {
            id_list.push($(this).attr('value'));
        });
        $.ajax({
            url: "/myurl",
            type: "post",
            data: { 'id_list': id_list },
            headers: {'X-CSRFToken': '{{ csrf_token }}'},
            dataType: 'text',  // 指定响应类型为文本,确保前端正确识别
            success: function(data) {
                console.log('后端响应:', data); // 调试用,确认返回内容
                window.location.reload();
            },
            error: function(xhr, status, error) {
                console.log('请求出错:', status, error); // 排查错误原因
            }
        });
    });
});

3. 额外排查点

  • 打开浏览器控制台的Network标签,查看AJAX请求的状态码和返回内容:
    • 若状态码为200但返回内容不是done!,说明后端判断逻辑仍有问题;
    • 若状态码为403,检查页面源码中{{ csrf_token }}是否被正确渲染为真实token值;
    • 若状态码为404,确认urls.py中/myurl是否正确映射到mydef视图。

经过以上调整,前端的success回调应该能正常触发,页面重载功能也会生效。

内容的提问来源于stack exchange,提问作者Saeed Ramezani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:27:56