首页 > 解决方案 > 将表单数据保存到 models.ForeignKey 字段

问题描述

我正在开发一个存储书籍详细信息的网络应用程序。我创建了一个表单页面来在数据库中添加书籍的详细信息。当我提交该表格时,它给了我错误。

valueError: Cannot assign "'scifi'": "Book.genre" must be a "Genre" instance. 

有什么方法可以将提交表单中的数据分配给 Book 类中的 models.ForeignKey(Genre,on_delete=models.CASCADE,null=True) 。

模型.py

class Genre(models.Model):
    title=models.CharField(max_length=100)
    class Meta:
        verbose_name_plural='2. Genre'
    def __str__(self):
        return self.title


class Language(models.Model):
    title=models.CharField(max_length=100)
    class Meta:
        verbose_name_plural='3. Language'
    def __str__(self):
        return self.title

class Book(models.Model):
    image=models.ImageField(upload_to="book_imgs/",null=True)
    title=models.CharField(max_length=200,null=True)
    Author=models.CharField(max_length=200,null=True)
    genre=models.ForeignKey(Genre,on_delete=models.CASCADE,null=True)
    language=models.ForeignKey(Language,on_delete=models.CASCADE,null=True)


    class Meta:
        verbose_name_plural='1. Book'

    def __str__(self):
        return self.title

    def image_tag(self):
        return mark_safe('<img src="%s" width="50" height="50" />' % (self.image.url))

视图.py

def add_books(request):
    if request.method =="POST":
        bookname= request.POST['bookname']
        author= request.POST['author']
        genre= request.POST['genre']
        language= request.POST['language']
        instance = Book(title=bookname,Author=author,genre=genre,language=language)
        instance.save()      
        
    return render(request,'Add_books.html')

标签: djangodjango-modelsdjango-viewsdjango-formsdjango-templates

解决方案


你做错了什么她是

genre= request.POST['genre']

上面的代码给你一个字符串值,而

instance = Book(title=bookname,Author=author,genre=genre,language=language)

类型接受一个模型对象

改为这样做

genre = Genre.objects.get(title = reqeust.POST['genre'])

接着

instance=Book(title=bookname,Author=author,genre=genre,language=language)

推荐阅读