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

Django ModelForm验证失败后如何保留用户输入旧值?

在Django ModelForm中实现Laravel old()的旧值保留功能

Django的ModelForm结合FormView使用时,默认就支持表单验证失败后保留用户提交的旧值,无需像Laravel那样手动调用old()函数。核心是确保视图流程正确,让绑定了用户输入的表单实例传递到模板,同时模板正确渲染字段。

你的代码需要修正的几个点

  1. 修复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)
    
  2. 简化表单类的冗余代码
    你的__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 /"
                }),
            }
    
  3. 模板渲染的正确性
    你当前模板中{{ 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:43:31