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
相关产品推荐
相关产品推荐

