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

Django保存ModelForm表单时如何关联外键填充作者字段

报错原因

NOT NULL constraint failed: blog_post.author_id报错是因为Post模型的author是必填外键字段,但你的newPost表单没有包含该字段,直接调用表单save()方法时,生成的数据库记录缺少author_id值,触发了数据库非空约束。

修复方案

调用表单save()方法时传入commit=False参数,先生成暂未写入数据库的Post模型实例,给实例绑定当前登录用户为作者后,再调用实例的save()方法完成入库即可。
视图已经加了@login_required装饰器,request.user可以直接取到当前登录的有效用户对象,不需要额外做判空校验。

修改后的视图函数对应代码段如下:

@login_required
def newpost(request):
    if request.method == 'POST':
        post = newPost(request.POST or None)
        if post.is_valid():
            # 生成内存中的Post实例,暂不写入数据库
            post_obj = post.save(commit=False)
            # 绑定当前登录用户为帖子作者
            post_obj.author = request.user
            # 最终写入数据库
            post_obj.save()
            messages.success(request,f'New blog post added. Add more if you want')
            return redirect('blog-newpost')
    else:
        post = newPost()
    context = {'title':'New Post','post': post}
    return render(request,'blog/newpost.html',context)
注意事项
  • commit=False是Django ModelForm处理自动填充字段(比如关联外键、自动生成的时间戳、操作人字段等)的标准写法,不会丢失表单内已校验通过的字段数据。
  • 不要为了省事把author字段加入表单的fields列表让用户提交,这会造成越权漏洞,恶意用户可以伪造请求将帖子作者设置为任意账号。

内容的提问来源于stack exchange,提问作者Muhammed Haris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:06:28