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

Django集成Ajax报错:'WSGIRequest'对象无'is_ajax'属性

解决Django中'WSGIRequest' object has no attribute 'is_ajax'错误

错误原因

Django 3.1及更高版本已经移除了request.is_ajax()方法。这个方法原本依赖X-Requested-With: XMLHttpRequest请求头判断AJAX请求,但官方认为该方式不够可靠,因此直接调用会抛出AttributeError。

修复步骤及代码调整

1. 后端视图(views.py)调整

替换is_ajax()的判断逻辑,同时修正request.POST.get的调用错误(原代码用了方括号,get是方法需用括号):

from django.shortcuts import render
from django.http import JsonResponse

# 移除@csrf_exempt,改用安全的CSRF令牌传递
def order(request):
    # 手动判断AJAX请求
    is_ajax = request.headers.get('X-Requested-With') == 'XMLHttpRequest'
    if is_ajax:
        test = request.POST.get('test')
        print(test)
        # AJAX请求返回JSON响应而非页面
        return JsonResponse({'status': 'success', 'received_data': test})
    
    ctx = {'active_link': 'order'}
    return render(request, 'food/order.html', ctx)

2. 前端JS(cart.js)调整

添加CSRF令牌传递,修正URL生成方式(推荐用Django模板标签生成,避免硬编码路径):

function order(){
    var test='Ajax test';
    // 使用模板标签生成正确的URL(需确保URLconf中给order视图命名,比如name='order')
    var ur='{% url "order" %}'; 
    var orderData={};
    orderData['test']=test;
    
    // 获取页面中的CSRF令牌
    var csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
    
    $.ajax({
        url:ur,
        type:'POST',
        headers: {
            'X-CSRFToken': csrftoken,
            'X-Requested-With': 'XMLHttpRequest' // 供后端判断AJAX请求
        },
        data:orderData,
        success:function(data){
            console.log("Data sent successfully:", data);
        },
        error:function(xhr){
            console.error("Request failed:", xhr.responseText);
        }
    })
}

3. 前端模板(order.html)调整

  • 添加CSRF令牌输入框(如果base.html中没有的话)
  • 修改按钮类型为button,避免触发默认表单提交行为:
{% extends 'food/base.html' %}
{% load static %}
{% block title %}Order Food here {% endblock %}
{% block content %}

<!-- 添加CSRF令牌,Django会自动生成隐藏输入框 -->
{% csrf_token %}

<div class="container-fluid m-4">
    <div class="row">
    <div class="col-md-6 text-center">
        <h3>Order</h3>
        <div class="row">
            <div class="col-md-6" id="name">
                <h5>Name</h5>
            </div>
            <div class="col-md-1" id="size">
                <h5>Size</h5>
            </div>
            <div class="col-md-2" id="price">
                <h5>Price</h5>
            </div>
        </div>
        <h5 id="total">Total :</h5>
    </div>
        <div class="col-md-1" id="rm">

        </div>
    <div class="col-md-5 mt-4">
        <h5>Messages</h5>
        <textarea name="message" id="message" cols="40" rows="5"></textarea>
        <div class="ml-auto m-4">
        <!-- 改为type="button",避免默认提交行为 -->
        <button type="button" class="btn-success" onclick="order()">submit</button>
            </div>
    </div>
    </div>
</div>

<script src="{% static 'food/js/cart.js' %}"></script>

{% endblock %}

额外说明

  • 确保URLconf中给order视图设置了name属性,比如:
    path('order/', views.order, name='order')
    
  • 后端返回JsonResponse是AJAX请求的标准做法,前端可以根据返回的JSON数据做进一步处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:40:54