为何Django中FormView无法自动保存对象而CreateView可以?
Django中FormView与CreateView的保存行为差异解答
问题描述
我是Django新手,查阅FormView和CreateView的源码后发现二者继承关系看起来一致,但实际使用时差异明显:我写的继承FormView的视图必须重写form_valid方法手动调用form.save()才能保存对象,而继承CreateView的视图不用额外操作就能自动保存对象,想知道原因。
FormView实现代码
class MyFormView(FormView): form_class = MyForm template_name = 'form.html' success_url = "/thanks/" def form_valid(self, form): form.save() return super().form_valid(form)
CreateView实现代码
class PersonCreateView(CreateView): model = Person fields = '__all__' template_name = 'form.html'
原因解析
虽然FormView和CreateView的继承链顶层都关联到BaseFormView,但二者的核心差异在于CreateView额外继承了ModelFormMixin,这个Mixin是实现自动保存的关键:
ModelFormMixin会自动为你创建关联了模型的ModelForm,而非普通Form;你用CreateView时指定model和fields,Django就会自动生成对应的ModelForm类- 该Mixin的
form_valid方法已经内置了调用form.save()的逻辑,因此无需手动编写保存代码 - 而FormView是基于普通Form的视图,它默认的
form_valid方法仅负责跳转到success_url,没有内置保存逻辑,所以必须手动添加form.save()才能完成对象存储
另外补充:如果你的MyForm本身是继承自ModelForm的表单类,那手动调用form.save()是有效的,但FormView不会主动帮你执行这一步操作。
内容的提问来源于stack exchange,提问作者AArgh
相关产品推荐
相关产品推荐

