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

在Django中通过Ajax发送POST请求时出现内部服务器错误

解决Ajax提交购物车时的500内部服务器错误

以下是导致错误的核心问题及对应修复方案:

1. Action参数大小写不匹配

视图中判断条件为request.POST.get('action') == "POST",但Ajax请求里传递的action值是小写的'post',这会导致条件不成立,视图无响应返回,触发500错误。

修复:
将视图中的判断改为与Ajax一致的小写:

if request.POST.get('action') == "post":

2. 商品数量获取方式错误

Ajax中通过$('#select option:selected').text()获取数量,这会拿到选项的显示文本(可能包含非数字内容),转换为整数时会抛出异常。应使用val()获取选项的value属性值(通常存储数字)。

修复:
修改Ajax中的product_quantity取值:

product_quantity: $('#select option:selected').val(),

3. 视图未处理异常请求

当前视图仅在action匹配时返回响应,若请求不符合条件(比如非POST请求、action不匹配),无任何返回,服务器会因缺少响应报错。

修复:
在视图末尾添加默认响应:

return JsonResponse({"error": "Invalid request"}, status=400)

修改后的完整代码示例

Views.py

def cart_add(request):
    cart = Cart(request)
    if request.POST.get('action') == "post":
        print("oky")
        product_id = int(request.POST.get('product_id'))
        product_quantity = int(request.POST.get('product_quantity'))
        product = get_object_or_404(Product, id=product_id)

        cart.add(product=product, quantity=product_quantity)
        
        # 修正拼写错误:Prodct → Product,Qantity → Quantity
        response = JsonResponse({"Product Name": product.name, "Product Quantity": product_quantity})
        return response
    # 处理不符合条件的请求
    return JsonResponse({"error": "Invalid request method or action"}, status=400)

Ajax代码

<script>
$(document).on('click','#add-button',function(e){
    e.preventDefault();
    console.log('{{csrf_token}}')
    $.ajax({
        method: "POST",
        url : '{% url "cart-add" %}',
        data:{
            product_id: $('#add-button').val(),
            product_quantity: $('#select option:selected').val(),
            csrfmiddlewaretoken : '{{csrf_token}}',
            action : 'post'
        },
        success:function(json){
            console.log(json)
        },
        error:function(xhr,errmsg,err){
            // 添加错误日志,方便调试具体错误信息
            console.log(xhr.status + ": " + xhr.responseText);
        }
    })
})
</script>

额外调试建议:开启Django调试模式(DEBUG = True),此时500错误页面会显示详细的异常栈信息,能直接定位代码错误位置,提升调试效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:23:26