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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:09:03