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

Django Ajax请求返回400错误,如何在Ajax中显示提示消息?

问题解决指南

一、400 Bad Request 错误排查与修复

请求能到达后端else分支但返回400,通常和响应格式不合法、CSRF验证或参数匹配有关,以下是具体修复步骤:

  • 强制后端返回合法JSON响应
    后端仅打印信息无法满足前端dataType: "json"的解析要求,必须返回标准JSON格式。修改后端视图的else分支:

    from django.http import JsonResponse
    
    def Check_pending_request_approve_timesheet(request):
        # 业务逻辑判断
        if 审批条件满足:
            return JsonResponse({'status': 'success'})
        else:
            print("进入else分支")
            # 必须返回JSON,状态码设为200避免触发前端error回调
            return JsonResponse({'status': 'error', 'message': '存在未处理的待审批请求'}, status=200)
    
  • 确保CSRF令牌验证通过
    模板渲染的{{ csrf_token }}可能在动态场景下失效,改用从Cookie获取令牌的方式更可靠:

    // 定义获取CSRF令牌的工具函数
    function getCSRFToken() {
        let token = null;
        const cookies = document.cookie.split(';');
        for (let cookie of cookies) {
            const [key, value] = cookie.trim().split('=');
            if (key === 'csrftoken') {
                token = decodeURIComponent(value);
                break;
            }
        }
        return token;
    }
    
    // 修改Ajax请求的CSRF传递方式
    $.ajax({
        url: "{% url 'user:Check_pending_request_approve_timesheet' %}",
        headers: { 'X-CSRFToken': getCSRFToken() }, // 通过请求头传递
        data: { "year_month": yearMonth, "emp_id": emp_id },
        dataType: "json",
        type: "POST",
        // ... 其他回调逻辑
    });
    
  • 校验参数名匹配性
    确认后端视图接收的参数名和前端传递的year_month、emp_id完全一致(包括大小写、拼写),比如后端如果写request.POST.get('yearMonth')就会取不到值,导致逻辑异常。

  • 查看网络请求详情定位问题
    在浏览器控制台「网络」标签下,查看该POST请求的:

    • Form Data:确认参数是否正确传递
    • Response:查看后端返回的具体内容,判断是响应格式错误还是业务逻辑提示

二、Ajax中显示简单提示消息的几种方式

1. 用Bootbox(已有依赖)

直接利用代码中已引入的bootbox组件:

// 成功提示
bootbox.alert("工时表已审批通过");
// 错误提示
bootbox.alert("请先处理待审批请求");

2. 用Toastify(已有依赖)

封装成复用函数,方便调用:

function showToast(message, isError = false) {
    Toastify({
        text: message,
        duration: 3000,
        gravity: 'bottom',
        style: { background: isError ? '#e74c3c' : '#2ecc71' }
    }).showToast();
}

// 调用示例
showToast("工时表已审批");
showToast("操作失败,请重试", true);

3. 自定义无依赖提示

不想用第三方库的话,手动创建弹窗:

function showSimpleAlert(message, isError = false) {
    const alertDiv = $('<div class="custom-alert">' + message + '</div>');
    const bgColor = isError ? '#e74c3c' : '#2ecc71';
    alertDiv.css({
        position: 'fixed',
        bottom: '20px',
        left: '50%',
        transform: 'translateX(-50%)',
        padding: '12px 24px',
        backgroundColor: bgColor,
        color: '#fff',
        borderRadius: '4px',
        zIndex: 9999,
        boxShadow: '0 2px 8px rgba(0,0,0,0.2)'
    });
    $('body').append(alertDiv);
    // 3秒后自动消失
    setTimeout(() => alertDiv.fadeOut(300, () => alertDiv.remove()), 3000);
}

// 调用示例
showSimpleAlert("操作成功");
showSimpleAlert("参数错误,请检查", true);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:21:49