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

Django表单数据无法写入数据库,请求排查解决方法

问题分析与修复方案

你的代码存在三个核心问题,导致表单数据无法存入数据库:

1. 表单提交目标未关联保存逻辑

表单的action="/new_activity/"指向的是仅返回页面的new_activity视图,而负责数据保存的create_new_activity视图并未在urls.py中配置路由,POST请求根本没触发保存代码。

2. 缺少Django强制要求的CSRF令牌

Django默认会拦截没有CSRF令牌的POST请求,你的表单未添加该令牌,导致请求被安全机制阻断。

3. 视图未区分请求类型

即使路由配置正确,当前视图也没有判断请求方法,GET请求时也会执行保存逻辑,引发无效操作。


最小改动修复步骤:

第一步:修改views.py,让new_activity视图同时处理GET和POST请求(无需新增视图)

from django.shortcuts import render, redirect
from django.http import HttpRequest
from .models import Activity

def index(request: HttpRequest):
    return render(request, "activity/index.html")

def new_activity(request: HttpRequest):
    # 仅在POST请求时处理数据保存
    if request.method == "POST":
        activity_name = request.POST.get("activity_name")
        if activity_name:  # 简单校验,避免存入空值
            Activity.objects.create(activity_name=activity_name)
        return redirect("/")
    # GET请求时返回表单页面
    return render(request, "activity/new_activity.html")

第二步:在new_activity.html的表单中添加CSRF令牌

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>New Activity</h1>

    <form action="/new_activity/" method="post">
        {% csrf_token %}  <!-- 新增这一行 -->
        <input type="text" name="activity_name" id="activity_name">
        <button type="submit">Add Activity</button>
    </form>
</body>
</html>

第三步:urls.py保持原配置即可

因为我们把保存逻辑合并到了已有的new_activity视图中,原路由已经指向该视图,无需新增配置。


验证方法:

  1. 重启Django服务
  2. 访问/new_activity/输入活动名称提交
  3. 查看数据库,即可看到新增的Activity记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:03:20