Django 3 Form表单提交无报错但数据未写入数据库,如何排查?
问题根因
你碰到的核心问题是表单提交路径和处理提交逻辑的视图路由不匹配:
- 你的HTML表单
action属性写的是/,意味着所有提交请求都会发送给站点根路径对应的视图处理 - 而你写的
ticketing_app视图对应的路由是/ticketing/或者/ticketing-instance/这类路径,POST请求根本没有进入到这个视图里执行,自然不会触发数据写入逻辑,也不会打印你加的POST相关日志,只有GET请求访问表单页面时才会触发else分支的打印。
修复步骤
- 修正表单的提交路径
把表单的action属性改成你ticketing_app视图对应的路由,比如如果你的路由配置里这个视图对应/ticketing/,就改成:
<form action="/ticketing/" method="POST" id="ticketsubmitform">
如果是同路径提交也可以直接留空action="",会自动提交到当前页面所在的路径。
- 补充校验错误排查逻辑
如果修正路径后还是出现form.is_valid()返回False的情况,可以在视图POST分支里加一行打印错误信息,快速定位校验失败原因:
if request.method == 'POST': form = TicketForm(request.POST) print(form.errors) # 加这行打印表单校验错误 if form.is_valid(): # 原有保存逻辑
- (可选)改用ModelForm简化代码
你现在的普通Form和Model字段完全对应,可以直接用Django的ModelForm减少重复代码:
# forms.py from django.forms import ModelForm from .models import Ticket class TicketForm(ModelForm): class Meta: model = Ticket fields = ['date_submitted', 'contact_name'] labels = { 'date_submitted': '提交日期:', 'contact_name': '联系人姓名:' } error_messages = { 'date_submitted': { 'required': '日期不能为空', }, 'contact_name': { 'required': '联系人姓名不能为空', 'max_length': '姓名不能超过45个字符' } }
视图里保存的时候直接调用form.save()即可,不用手动逐个字段赋值。
内容的提问来源于stack exchange,提问作者BCerveza
相关产品推荐
相关产品推荐

