Django提交表单数据到models.ForeignKey字段报错如何解决?
问题原因
你提交的表单中genre字段传的是字符串值(比如示例中的scifi),但Book.genre是外键字段,必须接收Genre模型的实例或者对应Genre记录的主键ID值,直接传字符串就会触发这个报错。Book.language字段也存在相同的问题需要同步修改。
解决方案
方案1:表单提交分类ID(推荐)
调整前端表单的下拉选项,让genre、language字段提交对应表的主键ID,此时视图层可以直接赋值:
def add_books(request): if request.method =="POST": bookname= request.POST['bookname'] author= request.POST['author'] # 接收表单提交的genre_id、language_id genre_id = request.POST['genre'] language_id = request.POST['language'] # 外键字段可以直接传_id参数赋值主键 instance = Book(title=bookname,Author=author,genre_id=genre_id,language_id=language_id) instance.save() return render(request,'Add_books.html')
方案2:表单提交分类名称,后端先查询/创建对应实例
如果你的表单确实只能提交分类的文本名称,可以先根据名称查询对应的Genre、Language实例,不存在的话可以根据业务需求选择自动创建或者抛出错误提示:
def add_books(request): if request.method =="POST": bookname= request.POST['bookname'] author= request.POST['author'] genre_title = request.POST['genre'] language_title = request.POST['language'] # get_or_create会先查询,不存在就新建一条记录,返回(实例, 是否新建) genre, _ = Genre.objects.get_or_create(title=genre_title) language, _ = Language.objects.get_or_create(title=language_title) instance = Book(title=bookname,Author=author,genre=genre,language=language) instance.save() return render(request,'Add_books.html')
注意:如果不允许用户新增分类,就把
get_or_create换成get,同时捕获Genre.DoesNotExist异常给前端返回错误提示,引导用户选择已存在的分类。
内容的提问来源于stack exchange,提问作者mahesh
相关产品推荐
相关产品推荐

