Django表单提交后数据未存入数据库问题求助
问题排查与修复方案
你的代码存在多处字段不匹配、类型错误和逻辑问题,导致表单数据无法保存,以下是具体问题和修复步骤:
1. 视图函数(Views.py)的问题
- 错误访问
form.cleaned_data['Competitors'],但表单和模型中均无此字段,触发KeyError后直接跳过form.save()执行。 - 渲染模板时未传递
form变量,导致表单验证失败时无法显示错误信息,也无法回显用户输入。 - 未处理表单验证失败的分支,且成功保存后未做重定向,易引发重复提交问题。
修复后的视图代码:
from django.shortcuts import render, redirect from .forms import CompetitorsReg from .models import Competitors def competitors(request): if request.method == "POST": form = CompetitorsReg(request.POST) if form.is_valid(): form.save() return redirect('competitors') # 替换为你的URL名称,避免重复提交 else: form = CompetitorsReg() # 传递表单对象和竞赛者列表到模板 tourcompetitors = Competitors.objects.all() return render(request, 'forms.html', {'form': form, 'tourcompetitors': tourcompetitors})
2. 表单类(Forms.py)的问题
- 手动定义的
name、weight、rank字段完全多余,且weight为ImageField,与模型中Weight(IntegerField)类型不匹配,直接导致表单验证失败。 - ModelForm会自动根据模型生成对应字段,只需通过
Meta类配置即可。
修复后的表单代码:
from django import forms from .models import Competitors class CompetitorsReg(forms.ModelForm): class Meta: model = Competitors fields = ["flname", "Weight", "rank"] labels = { 'flname': "Full Name", "Weight": "Weight", 'rank': "Rank" }
3. 模板(forms.html)的问题
- 姓名输入框的
name属性为fname,与表单/模型中的flname不匹配,导致数据无法被表单接收。 - 体重输入框的
type拼写错误(interger→integer),需修正以确保输入为数字类型。 - 下拉选择框的
id属性未闭合(id="rank>→id="rank"),属于语法错误。 - 循环显示竞赛者数据时,变量引用错误(
{{ competitors.flname }}→{{ x.flname }})。
修复后的模板代码:
<!DOCTYPE html> <html> <body> <h1>Registration form</h1> <form action="" method="post" novalidate> {% csrf_token %} <label for="flname">First and Last Name:</label><br> <input type="text" id="flname" name="flname" value="{{ form.flname.value|default:'' }}"><br> {% if form.flname.errors %} <span style="color: red;">{{ form.flname.errors.0 }}</span> {% endif %} <label for="Weight">Weight:</label><br> <input type="number" id="Weight" name="Weight" value="{{ form.Weight.value|default:'' }}"><br> {% if form.Weight.errors %} <span style="color: red;">{{ form.Weight.errors.0 }}</span> {% endif %} <label for="rank">Rank:</label><br> <select name="rank" id="rank"> <option value="white" {% if form.rank.value == 'white' %}selected{% endif %}>White</option> <option value="blue" {% if form.rank.value == 'blue' %}selected{% endif %}>Blue</option> <option value="purple" {% if form.rank.value == 'purple' %}selected{% endif %}>Purple</option> <option value="brown" {% if form.rank.value == 'brown' %}selected{% endif %}>Brown</option> <option value="black" {% if form.rank.value == 'black' %}selected{% endif %}>Black</option> </select><br><br> {% if form.rank.errors %} <span style="color: red;">{{ form.rank.errors.0 }}</span> {% endif %} <input type="submit" value="Submit"> </form> <ul> {% for x in tourcompetitors %} <li>{{ x.flname }}</li> {% endfor %} </ul> </body> </html>
额外优化建议
- 模型中的字段名
Weight首字母大写,建议改为小写weight,符合Python变量命名规范,避免后续混淆。 - 确保URL配置正确指向
competitors视图函数。
内容的提问来源于stack exchange,提问作者bastian31lengoc
相关产品推荐
相关产品推荐

