Сохранение данных формы в моделях.Поля внешнего ключа

#django #django-models #django-views #django-forms #django-templates

Вопрос:

Я работаю над веб-приложением, в котором хранятся сведения о книгах.Я создал страницу формы для добавления сведений о книгах в базу данных. когда я отправляю эту форму, она выдает мне ошибку.

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

Есть ли какой-либо способ присвоить модели данные из представленной формы.Иностранный ключ(Жанр,on_delete=модели.КАСКАД,null=True), который находится в классе Book.

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

 

Ответ №1:

то, что ты делаешь с ней неправильно, это

 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)
 

Ответ №2:

Просто разрешите жанр в его экземпляре:

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

В настоящее время вы передаете название жанру, вместо этого должен быть сам первичный ключ/экземпляр.

Хотя, .get возникнет DoesNotExist исключение, если нет жанра, поэтому вы можете захотеть сделать:

genre = Genre.objects.get_or_create(title=genre) вместо