如何在FormView.get_success_url()中访问已清理验证的表单数据?
在FormView.get_success_url()中访问已验证表单数据的方法
好问题!Django的FormView默认确实不会把验证后的表单实例附加到视图对象上,但我们可以通过一个简单的重写操作解决这个问题,完美契合你想用get_success_url()方法的需求。
核心方案:重写form_valid()保存表单实例
你只需要在视图里重写form_valid()方法,把验证通过的表单赋值给视图的实例属性,这样后续调用get_success_url()时就能直接访问表单的清理后数据了。
示例代码如下:
from django.views.generic.edit import FormView from .forms import YourCustomForm class CustomFormView(FormView): form_class = YourCustomForm template_name = "form_template.html" def form_valid(self, form): # 将验证后的表单保存为视图实例属性 self.validated_form = form # 调用父类方法,保持默认的表单处理逻辑(比如无需额外保存操作) return super().form_valid(form) def get_success_url(self): # 现在可以直接访问清理后的表单数据啦 cleaned_data = self.validated_form.cleaned_data # 根据你的需求构造跳转URL,比如用某个字段的值 return f"/success-page/{cleaned_data['target_field']}/"
为什么这个方法可行?
在FormView的调度流程中,form_valid()是在表单验证通过后才会被调用的,此时传入的form参数已经完成了数据清理和验证,是完全可靠的。把它赋值给视图的实例属性后,当get_success_url()被调用时(父类的form_valid()会触发这个调用),这个属性依然存在,自然就能访问到里面的cleaned_data了。
额外提示
如果你的表单是ModelForm,并且在form_valid()中保存了对象(比如继承自CreateView/UpdateView),那你其实可以直接用self.object来获取对象数据,无需单独保存表单实例。但对于普通的Form(非ModelForm),上面的方法是最直接有效的。
内容的提问来源于stack exchange,提问作者Lucretiel
相关产品推荐
相关产品推荐

