mahesh
mahesh

Reputation: 43

Saving form data to models.ForeignKey fields

I am working on a web-app which store books details.I created a form page to add details of books in database. when i am submitting that form it gives me error.

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

Is there any way to assign data from submitted form to the models.ForeignKey(Genre,on_delete=models.CASCADE,null=True) which is in Book class.

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

Upvotes: 0

Views: 300

Answers (2)

MuTanT46
MuTanT46

Reputation: 66

what you are doing wrong her is

genre= request.POST['genre']

the above code gives you a string value while

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

the genre accepts a model object

do this instead

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

and then

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

Upvotes: 2

Egor Wexler
Egor Wexler

Reputation: 1944

Just resolve genre to its instance:

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

Currently you're passing title to genre, should be primary key/instance itself instead.

Though, .get will raise DoesNotExist exception if there is no genre, so you may want to do:

genre = Genre.objects.get_or_create(title=genre) instead

Upvotes: 1

Related Questions