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

Ajax发起POST请求提示csrftoken is not defined错误如何解决

解决方案

方式1:从Cookie中自动读取(推荐,无需依赖模板渲染)

将读取Cookie的代码放在你现有csrfSafeMethod函数之前即可,完整实现如下:

// 读取指定名称Cookie的工具函数
function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
// 定义csrftoken变量
const csrftoken = getCookie('csrftoken');

// 你原来的csrfSafeMethod方法
function csrfSafeMethod(method) {
    // 这些HTTP方法不需要CSRF保护
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

Django默认会在站点Cookie中写入名为csrftoken的凭证,该方法不需要修改模板配置,适合JS代码单独作为静态文件存放的场景。

方式2:通过Django模板直接赋值(最简单,适合JS写在HTML模板内的场景)

如果你的这段JS代码直接写在Django的HTML模板文件中,只需要在调用csrftoken前新增一行赋值代码即可:

const csrftoken = '{{ csrf_token }}';

Django渲染模板时会自动将{{ csrf_token }}模板标签替换为实际的CSRF令牌值。


额外优化提示

你现有AJAX代码的data参数写法存在问题,FormData实例不能直接作为对象属性值传递,如果需要同时提交表单数据和自定义的todosDatos参数,需要将额外参数追加到FormData实例中:

$("#formTabla").submit(function(event){
    event.preventDefault();
    var formData = new FormData(this);
    // 追加自定义参数
    formData.append('datos', JSON.stringify(todosDatos));
    $.ajax({
        beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        },
        url : "{% url 'submit' %}",
        type: "POST",
        processData: false,
        contentType: false,
        // 直接传入FormData实例即可
        data: formData,
        success: function (respuesta){
        }
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:27:05