#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)
вместо