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

Django项目AJAX POST请求CSRF验证失败,无法传递数据求助

Django AJAX POST请求CSRF验证失败问题解决

问题分析

你的代码里有几个关键错误,直接导致CSRF验证失败、数据无法传递到目标视图:

1. AJAX请求URL不匹配

urls.py中defaultpg视图对应的路径是eafterhome/,但你AJAX里硬编码的url: '/defaultpg'完全不对,请求根本到不了目标视图。

2. CSRF Token传递错误

你在data里写的'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]")是获取jQuery对象,不是Token的实际值,必须加.val()来提取Token字符串。

3. 表单默认提交行为未阻止

validateForm函数触发AJAX后没有返回false,导致表单会执行默认的刷新提交,AJAX请求被中断,数据自然传不到后端。

4. 视图返回类型不匹配

AJAX指定了dataType: "json",但视图返回的是redirect('Entry')(HTTP重定向),不符合JSON响应要求,会触发AJAX的error回调,让你误以为请求失败。


修正后的代码

registration.html 修正版

<form method="POST" onsubmit="return validateForm()">
  {% csrf_token %}

  <label for="name">Name:</label>
  <input type="text" id="name" name="name" required />

  <label for="email">Email:</label>
  <input type="email" id="email" name="email" required />

  <label for="password">Password:</label>
  <input type="password" id="password" name="password" required />

  <input type="submit" value="Register" name="createuser"/>
</form>

<script>
  let URLd = "{% url 'defaultpg' %}"
  let nameInput = document.getElementById("name");
  let emailInput = document.getElementById("email");
  let passwordInput = document.getElementById("password");

  function validateForm() {
    // 正确获取CSRF Token的值
    var csrfToken = $("input[name='csrfmiddlewaretoken']").val();

    let nameValue = nameInput.value;
    let emailValue = emailInput.value;
    let passwordValue = passwordInput.value;
    let isNameValid = /^[a-zA-Z]+$/.test(nameValue);
    let isEmailValid = /^\S+@\S+\.\S+$/.test(emailValue);
    let isPasswordValid = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/.test(passwordValue);

    if (isNameValid) {
      if (isEmailValid) {
        if (isPasswordValid) {
          $.ajax({
            type: "POST",
            url: URLd, // 使用模板生成的正确URL,避免硬编码错误
            data: {
              "name": nameValue,
              "email": emailValue,
              "password": passwordValue,
              'csrfmiddlewaretoken': csrfToken // 传递Token实际值
            },          
            dataType: "json",
            success: function (data) {
                alert("数据已成功提交!");
                // 如果需要跳转,在这里用JS处理:window.location.href = "{% url 'Entry' %}"
            },
            error: function (xhr) {
                alert("提交失败:" + xhr.responseText);
            }
          });
          return false; // 阻止表单默认刷新提交
        } else {
          alert("密码必须包含大小写字母、数字,长度不少于8位");
        }
      } else {
        alert("请输入有效的邮箱地址");
      }
    } else {
      alert("请输入有效的姓名(仅字母)");
    }
    return false; // 验证失败时也阻止提交
  }
</script>

views.py 修正版

from django.http import JsonResponse

@csrf_protect
def defaultpg(request):
    if request.method == "POST":
        name = request.POST.get('name')
        email = request.POST.get('email')
        password = request.POST.get('password')

        print("------------------------")
        print(name)
        print(email)
        print(password)
        print("------------------------")

        # 返回符合AJAX要求的JSON响应
        return JsonResponse({"status": "success"}, status=200)

额外提示

  • 确保页面已经加载了jQuery,否则$符号会报错;
  • 打开浏览器控制台的「Network」标签,查看AJAX请求的状态码和响应内容,方便快速排查问题;
  • 如果需要跳转页面,在AJAX的success回调里用JS实现,不要让后端返回重定向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:44:50