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
相关产品推荐
相关产品推荐

