Django中如何在CreateView内获取新创建对象的ID
问题原因
form.instance.id返回None是因为你访问id的时候,这个模型实例还没有写入数据库。Django模型的自增主键id是在记录存入数据库时由数据库生成的,你当前代码里创建通知的逻辑在super().form_valid(form)之前执行,而super().form_valid(form)才是真正完成实例保存的步骤,自然拿不到id。
可行解决方案
你可以选以下任意一种写法调整代码逻辑:
- 方案一:先手动保存实例拿到id,再执行通知创建
from django.http import HttpResponseRedirect def form_valid(self, form): # 给非用户填写字段赋值 form.instance.created_by = self.request.user form.instance.status = 'open' # 主动保存表单实例,保存后实例会自动获得数据库生成的id self.object = form.save() messages.success(self.request, 'Ticket Created Successfully!') # 此时访问self.object.id 或 form.instance.id 都能拿到正确值 Notification.objects.create( created_by=self.request.user, created_for=self.object.responsible, title=f"New ticket from {self.request.user.first_name} {self.request.user.last_name} =====> {self.object.id}", message="Hello", ) # 保存完成后跳转到成功页 return HttpResponseRedirect(self.get_success_url())
- 方案二:先执行父类的保存逻辑,再创建通知
def form_valid(self, form): form.instance.created_by = self.request.user form.instance.status = 'open' messages.success(self.request, 'Ticket Created Successfully!') # 先调用父类方法完成实例保存,拿到重定向响应 response = super().form_valid(form) # 父类方法执行后,self.object就是已经存库的实例,id已生成 Notification.objects.create( created_by=self.request.user, created_for=self.object.responsible, title=f"New ticket from {self.request.user.first_name} {self.request.user.last_name} =====> {self.object.id}", message="Hello", ) # 返回重定向响应 return response
补充说明:不管是用类视图还是普通ModelForm,只要是没执行过
save()的新模型实例,自增id字段的值都是None,这是Django的正常机制,不是字段写法错误。
内容的提问来源于stack exchange,提问作者Caio César P. Ricciuti
相关产品推荐
相关产品推荐

