Django ModelForm验证失败后如何保留用户输入旧值?
在Django ModelForm中实现Laravel old()的旧值保留功能
Django的ModelForm结合FormView使用时,默认就支持表单验证失败后保留用户提交的旧值,无需像Laravel那样手动调用old()函数。核心是确保视图流程正确,让绑定了用户输入的表单实例传递到模板,同时模板正确渲染字段。
你的代码需要修正的几个点
修复
form_valid方法的错误返回
你当前的form_valid直接返回True,破坏了FormView的默认流程,可能导致表单状态异常。正确写法如下:def form_valid(self, form): print("form valid") menu = self.kwargs.get('menu') if menu in Menu.placeMenu: form.save() # 可选:添加成功提示(需先配置messages框架) # messages.success(self.request, "菜单添加成功") else: # 可选:添加错误提示 # messages.error(self.request, "无效的菜单位置") # 位置无效时,返回表单无效响应 return self.form_invalid(form) # 调用父类方法完成重定向到success_url return super().form_valid(form)简化表单类的冗余代码
你的__init__方法仅调用父类逻辑,没有额外操作,可以直接删除,简化后的表单类:class AddMenuForm(forms.ModelForm): class Meta: model = Menu fields = "__all__" widgets = { 'title': forms.TextInput(attrs={ 'class': 'form-control', 'id': 'inputname', 'placeholder': "نام آیتم" }), 'url': forms.TextInput(attrs={ 'class': 'form-control', 'id': 'inputurl', 'placeholder': "mr-keshi.ir /" }), }模板渲染的正确性
你当前模板中{{ form.title }}的写法是正确的,Django会自动渲染带有旧值的输入框,同时保留错误提示。只需确保表单的method="post"和csrf_token正确配置(你已完成)。
原理说明
当用户提交表单后:
- 若验证失败,
form_invalid方法会将绑定了用户提交数据的表单实例传递给模板 - 模板渲染
{{ form.field_name }}时,Django自动从表单实例中读取用户之前的输入值,填充到对应输入框中,同时展示错误信息
手动获取旧值的场景(自定义输入框时)
如果需要手动渲染输入框而不是用Django的表单字段渲染,可以通过form.field_name.value获取旧值,示例:
<input type="text" name="title" id="inputname" class="form-control" placeholder="نام آیتم" value="{{ form.title.value|default:'' }}">
不过通常直接使用{{ form.title }}更高效,Django会自动处理所有属性和状态。
内容的提问来源于stack exchange,提问作者alireza keshavarz
相关产品推荐
相关产品推荐

