Django表单提交不显示字段错误直接抛出ValueError如何解决?
Django表单提交报错问题修复方案
问题根因
你遇到的报错和错误提示不展示的问题,由两处代码错误导致:
1. 视图层表单校验方法未调用
你在views.py中判断表单是否合法时,将is_valid()方法直接写为is_valid,没有加括号执行。is_valid是表单对象的可调用方法,直接引用方法对象时布尔值永远为True,因此哪怕表单校验失败,也会直接执行fm.save()触发ValueError。
修复后的views.py代码:
from django.shortcuts import render from .forms import TrackReportForm from .models import InitialData def initialview(request): if request.method=='POST': fm=TrackReportForm(request.POST) # 必须加括号执行is_valid方法,才能拿到校验结果 if fm.is_valid(): fm.save() # 可选优化:提交成功后重定向,避免用户刷新页面重复提交 # return redirect('/data/') return render(request, 'account/database.html', {'form':fm}) else: fm=TrackReportForm() return render(request, 'account/database.html', {'form':fm})
2. 模板层错误提示未正确渲染
你当前模板中写的{{field.errors}}没有遍历上下文,不会渲染任何表单校验错误信息,因此用户看不到必填项和正则校验提示。
修复后的database.html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .error-msg{color: red; margin: 4px 0; font-size: 14px;} </style> </head> <body> <form action="" method="post" novalidate> {% csrf_token %} <!-- 渲染case_number字段和对应错误 --> <div> {{ form.case_number.label_tag }} {{ form.case_number }} {% for error in form.case_number.errors %} <p class="error-msg">{{ error }}</p> {% endfor %} </div> <!-- 渲染全局非字段错误 --> {% for error in form.non_field_errors %} <p class="error-msg">{{ error }}</p> {% endfor %} <input type="submit" value="Submit"> </form> </body> </html>
可选优化
你当前定义的正则校验规则r'OOPL\/D\/[0-9]'仅匹配后缀为单个数字的格式,如果需要支持多个数字的案例编号,可以修改为r'OOPL\/D\/[0-9]+',适配更长的数字序列。
内容的提问来源于stack exchange,提问作者noob87
相关产品推荐
相关产品推荐

