Django使用CreateView保存时报NOT NULL约束失败无法自动关联父项目外键
问题原因
- 外键字段名赋值错误:
IDTasks模型中关联ParentProject的外键字段命名为parent,但你在form_valid方法中错误赋值给了不存在的ParentProject属性,导致外键字段为空触发非空约束报错。 - 跳转参数不匹配:
parent_detail路由定义接收的参数是parent_id,但你在get_success_url中传递的键是pk,会导致跳转时报参数缺失错误。
修正后的视图代码
class add_idtask_view(SuccessMessageMixin, CreateView): model = IDTasks template_name = 'otis/id_report_form.html' form_class = idTaskForm success_message = "Report added" def form_valid(self, form): idtaskform = form.save(commit=False) idtaskform.user = self.request.user # 正确获取parent_id,赋值给对应的外键字段parent parent_id = self.kwargs.get('parent_id') idtaskform.parent = get_object_or_404(ParentProject, id=parent_id) idtaskform.save() return super(add_idtask_view, self).form_valid(form) def get_success_url(self): # 传递正确的参数名parent_id return reverse_lazy('otis:parent_detail', kwargs={'parent_id': self.kwargs.get('parent_id')})
补充说明
你之前写的idtaskform = form.save(commit=False)赋值后没有调用save(),反而直接修改form.instance,属于冗余代码,上面的修正里统一用idtaskform处理,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Bill Newhouse
相关产品推荐
相关产品推荐

