能否将第二段Django视图代码改为第一段形式?运行报错求解答
问题:将Django的create_new视图修改为指定形式是否可行?
我尝试把第二段Django视图代码改成第一段的形式,但操作后出现错误,请问这种修改是否可行?两段代码如下:
第一段代码:
def create_new(request): if request.method == 'POST': form = ArticleForm(request.POST) form.id_author = request.user.id if form.is_valid(): form.save() return redirect('home') return render(request, 'main/create_new.html')
第二段代码:
def create_new(request): if request.method == 'POST': form = ArticleForm(request.POST) if form.is_valid(): article = form.save(commit=False) article.author = request.user article.save() return redirect('home') return render(request, 'main/create_new.html')
这种修改不可行,原因很明确:
第一段代码的逻辑存在本质错误:你直接给表单对象
form赋值form.id_author = request.user.id,但Django的表单对象并不会把这种手动添加的属性传递给模型。当执行form.save()时,只会处理表单类中定义的字段数据,你加的id_author属性完全不会被识别,最终会导致模型的关联字段(author或id_author)缺失必填值,触发数据库验证报错。第二段代码是Django中处理「表单提交后补充模型字段数据」场景的标准正确写法:
form.save(commit=False)会创建一个未保存到数据库的模型实例article,此时可以自由修改实例的字段- 直接给模型实例的
author字段赋值为当前用户request.user,这是直接操作模型对象,数据会被正确识别 - 最后调用
article.save()完成数据入库,能确保用户关联关系正确建立
如果非要基于第一段代码的思路调整,你需要修改ArticleForm类:要么添加author(或id_author)为隐藏字段,要么在表单的save方法中处理用户关联,但这种做法既冗余又容易出错,远不如第二段代码的写法简洁可靠。
内容的提问来源于stack exchange,提问作者Basheer
相关产品推荐
相关产品推荐

