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视图中,原路由已经指向该视图,无需新增配置。
验证方法:
- 重启Django服务
- 访问
/new_activity/输入活动名称提交 - 查看数据库,即可看到新增的
Activity记录
内容的提问来源于stack exchange,提问作者Wade Kemmsies
相关产品推荐
相关产品推荐

