Django表单验证失败:POST表单提交后始终返回undone问题排查
表单提交后始终显示"undone"的问题解决办法
问题回顾
你通过POST表单提交员工数据时,页面一直显示undone,推测是表单验证未通过,我帮你检查了代码,发现几个关键错误:
视图函数里的核心问题
先看你的视图代码,有两个致命错误导致数据无法保存,进而target一直是undone:
1. 模型实例化缺少括号
你创建Employee对象时只是引用了类,没有生成实例:
em=models.Employee # 错误写法
必须加上括号才能创建一个新的员工实例:
em=models.Employee() # 正确写法
2. 调用save方法时缺少括号
em.save只是指向了保存方法,没有真正执行保存操作,必须加括号调用:
em.save # 错误写法 em.save() # 正确写法
可选优化:添加错误调试信息
为了方便你排查表单验证失败的具体原因,建议把表单对象传递到模板里,这样就能看到详细的错误提示。修改后的视图函数如下:
def addit(request): if request.method == 'POST': target = "undone" # POST请求下直接传递request.POST和request.FILES即可,不需要or None forms = employeeForm(request.POST, request.FILES) if forms.is_valid(): em = models.Employee() em.fname = forms.cleaned_data["fname"] em.cne = forms.cleaned_data["cne"] em.lname = forms.cleaned_data["lname"] em.division = forms.cleaned_data["division"] em.pic = forms.cleaned_data["pic"] em.salary = forms.cleaned_data["salary"] em.save() target = "done" # 把表单对象传给模板,验证失败时显示错误 return render(request, "home.html", {"target": target, "form": forms}) # 处理GET请求(比如首次打开页面) else: forms = employeeForm() return render(request, "home.html", {"form": forms})
然后在你的home.html模板里添加错误显示代码,这样就能直观看到哪里不符合验证规则:
{% if form.errors %} <div style="color: red; padding: 10px; border: 1px solid red;"> {% for field in form %} {% for error in field.errors %} <p>{{ field.label }}: {{ error }}</p> {% endfor %} {% endfor %} {% for error in form.non_field_errors %} <p>{{ error }}</p> {% endfor %} </div> {% endif %}
修复后的完整视图函数
上面的优化版已经是修复后的完整代码,你替换原来的视图函数后,再测试表单提交,应该就能正常显示done了。如果还是有问题,看模板里的错误提示就能知道具体是哪个字段验证失败。
内容的提问来源于stack exchange,提问作者Oussama Charra
相关产品推荐
相关产品推荐

