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

Django表单提交POST请求时is_valid返回False但is_bound为True的问题排查求助

问题排查与解决办法

嘿,我一眼就发现问题所在啦!你的表单明明填了内容却验证失败,核心原因是HTML表单里的输入字段name属性和Django表单类的字段名不匹配,导致Django根本没读取到你填写的数据,自然会提示“字段必填”。

具体问题分析

  • 你在forms.py里定义的表单字段是:mail、prenom、nom
  • 但HTML模板里对应的输入框name属性却是:addusermail、adduserprenom、addusernom

Django表单验证时,会严格按照表单类的字段名去POST请求数据里查找对应值,找不到就判定为“未填写”,哪怕你实际已经输入了内容。

两种解决方式

方式一:修改HTML表单的name属性(快速修复)

把HTML里的输入框name改成和Django表单字段完全一致的名字:

<form name="formadduser" action="" method="post" class="form" id="formadduser">
    {% csrf_token %}
    <label for="addusermail">Mail</label>
    <input required="required" type="text" name="mail" id="addusermail">
    <label for="adduserprenom">Prénom</label>
    <input required="required" type="text" name="prenom" id="adduserprenom">
    <label for="addusernom">Nom</label>
    <input required="required" type="text" name="nom" id="addusernom">
    <button type="submit">Ajouter</button>
</form>

方式二:用Django表单自动渲染(更推荐,避免手动出错)

直接利用Django表单的渲染能力,让框架自动生成匹配的输入框,省去手动写HTML的麻烦:

<form name="formadduser" action="" method="post" class="form" id="formadduser">
    {% csrf_token %}
    {{ form.mail.label_tag }}
    {{ form.mail }}
    {{ form.prenom.label_tag }}
    {{ form.prenom }}
    {{ form.nom.label_tag }}
    {{ form.nom }}
    <button type="submit">Ajouter</button>
</form>

这种方式能保证字段名完全匹配,还能自动继承表单类里的验证规则、标签等配置。

额外注意:views.py里的小坑

你在保存Users模型时写了form.cleaned_data["Mail"],这里的键是区分大小写的,应该和表单字段名一致用小写:

var = Users(mail = form.cleaned_data["mail"], prenom = form.cleaned_data["prenom"], nom = form.cleaned_data["nom"])

不然会抛出KeyError哦。

内容的提问来源于stack exchange,提问作者Bastien Guis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:12:42