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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:55:07