Django CreateView表单自动填充字段触发NOT NULL约束错误怎么解决?
错误原因
你遇到的NOT NULL constraint failed: quizes_course.major_id错误是两处写法问题共同导致的:
form.save(commit=False)会返回还未写入数据库的Course模型实例,原代码没有接收这个返回值,这行代码相当于没有产生任何实际效果。- 直接给
form对象自定义赋值major属性是无效的,Django的ModelForm执行保存逻辑时只会读取form.instance(即表单绑定的模型实例)的字段值,你额外给form加的属性不会被识别,最终写入数据库时major字段为空,触发非空约束报错。
修复方案
你可以直接修改表单绑定的模型实例的major字段,不需要手动调用save,父类的form_valid方法会自动完成后续保存逻辑,修改后的视图代码如下:
class CreateCourse(CreateView): model = Course form_class = CourseCreateForm template_name = 'quizes/create.html' def form_valid(self, form): major = get_object_or_404(Major, id=self.kwargs['pk']) # 直接修改表单绑定的模型实例字段 form.instance.major = major return super().form_valid(form)
如果想要手动控制保存流程,也可以使用以下写法:
from django.http import HttpResponseRedirect class CreateCourse(CreateView): model = Course form_class = CourseCreateForm template_name = 'quizes/create.html' def form_valid(self, form): # 接收未保存的实例 course = form.save(commit=False) major = get_object_or_404(Major, id=self.kwargs['pk']) course.major = major # 手动保存到数据库 course.save() # 跳转到成功页面 return HttpResponseRedirect(self.get_success_url())
内容的提问来源于stack exchange,提问作者hasan bilal
相关产品推荐
相关产品推荐

