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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 12:24:00