Django表单验证失败后session字段值不显示问题排查
问题根因
- Django的
CreateView是用于创建新对象的视图,在表单提交后验证失败的场景下,并不会给模板上下文传递object变量:因为新对象还未通过验证、没有写入数据库,object仅在对象成功创建、或者使用UpdateView编辑已有对象时才会存在。 - 你提交的表单数据在验证失败后,会全部保存在上下文的
form实例中,你之前的模板直接从object取值,自然拿不到内容导致回显失败。
解决方案
方案1:直接使用Django表单自带的字段渲染(最推荐)
Django表单自带字段渲染能力,默认自动处理回显、错误提示,无需手动拼接input标签,代码简化如下:
<form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.non_field_errors }} <div class="form-group row"> <label class="col-sm-2 col-form-label" for="{{ form.fantasia.id_for_label }}">fantasia: </label> <div class="col-sm-10"> {{ form.fantasia }} {{ form.fantasia.errors }} </div> </div> <!-- 其余字段同理修改字段名即可 --> <input type="submit" value="Save" class="btn btn-primary"> </form>
如果需要给input加自定义的form-control类,可以直接在Form定义中给对应字段的widget添加attrs属性:
class EmpresaForm(forms.ModelForm): class Meta: model = models.Empresa fields = ["fantasia", "razao", "cnpj", "seguimento"] widgets = { 'fantasia': forms.TextInput(attrs={'class': 'form-control'}), 'razao': forms.TextInput(attrs={'class': 'form-control'}), # 其余字段同理添加即可 }
方案2:保留手动写input的写法,修改取值来源
如果你确实需要完全自定义input标签,把原来value属性的取值从object改为form实例即可,同时添加default过滤器处理首次加载为空的情况:
<input class="form-control col-sm-10" id="fantasia" type="text" name="fantasia" value="{{ form.fantasia.value|default:'' }}">
其余所有字段的value都按这个规则修改即可正常回显。
内容的提问来源于stack exchange,提问作者marcelo.delta
相关产品推荐
相关产品推荐

