将表单数据保存到 models.ForeignKey 字段

时间:2021-07-07 13:39:28

标签: django django-models django-views django-forms django-templates

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

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

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

models.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))

views.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')

2 个答案:

答案 0 :(得分:2)

你做错了什么

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)

答案 1 :(得分:1)

只需将流派解析为其实例:

    instance = Book(
        title=bookname,
        Author=author,
        genre=Genre.objects.get(title=genre),
        language=language
    )

目前您正在将标题传递给流派,应该是主键/实例本身。

不过,如果没有流派,.get 会引发 DoesNotExist 异常,因此您可能需要这样做:

genre = Genre.objects.get_or_create(title=genre) 代替