You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:31:03