Как мне справиться с этой ошибкой: __init__() получил неожиданный аргумент ключевого слова ‘book_category’

#python #html #django #web

#python #HTML #django #веб

Вопрос:

Я пытаюсь ввести некоторые данные книги и сохранить их в своей базе данных с помощью django (пытаюсь создать веб-библиотеку)

Но я сталкиваюсь с такого рода ошибками:

init() получил неожиданный аргумент ключевого слова ‘book_category’

Ошибка, похоже, в этой строке кода :

форма = Форма категории(book_category= book_category)

Это код моего views.py

 class AddBook(View):
    def post(self, request):
        form = BooksForm(request.POST, request.FILES)
        if form.is_valid()  
            book_category = request.POST.get('book_category')
            firstname = request.POST.get('Firstname')
            lastname = request.POST.get('Lastname')
            author = Author.objects.filter(Q(firstname__icontains = firstname) amp; Q(lastname__icontains = lastname))
            if author:
                print(author)
            else:
                form = AuthorForm(firstname=firstname, lastname=lastname)
                form.save()
            
            category = Category.objects.filter(Q(book_category__icontains = book_category))
            if category:
                print(category)
            else:
                form = CategoryForm(book_category= book_category)
                form.save()

            author = Author.objects.filter(Q(firstname__icontains = firstname) amp; Q(lastname__icontains = lastname))
            for a in author:
                print(a.book_author_id)
                for c in category:
                    print(c.book_category_no)
                    book_title = request.POST.get('book_title')
                    book_cover = request.FILES.get('book_cover')
                    book_file = request.FILES.get('book_file')
                    book_year = request.POST.get('book_year')
                    book_tags = request.POST.get('book_tags')
                    book_summary = request.POST.get('book_summary')
                    form = Books(book_title = book_title, book_author_id = Author.objects.get(book_author_id = a.book_author_id), book_cover = book_cover,
                        book_file = book_file, book_year = book_year, book_summary = book_summary, book_category_no = Category.objects.get(book_category_no = c.book_category_no),
                        is_bookmarked = 0, is_downloaded = 0, is_read = 0, is_deleted = 0)

                    form.save()
                    return HttpResponse('Book Saved!')
        else:
            print(form.errors)
            return HttpResponse('Not Valid')
 

И вот мой models.py:

 class Category(models.Model):
    book_category_no = models.AutoField(primary_key=True)
    book_category = models.CharField(max_length=100)

    class Meta:
        db_table = "Category"

class Books(models.Model):
    book_id = models.AutoField(primary_key=True)
    book_title = models.CharField(max_length = 100)
    book_author_id = models.ForeignKey(Author, on_delete=models.CASCADE)
    book_cover = models.ImageField(upload_to='media/')
    book_file = models.FileField(upload_to='media/')
    book_year = models.DateField()
    book_tags = models.CharField(max_length = 100)
    book_summary = models.CharField(max_length = 100)
    book_category_no = models.ForeignKey(Category, on_delete=models.CASCADE)
    date_added = models.DateField(default=timezone.now)
    # book_info = models.CharField(max_length = 100, default="")
    is_bookmarked = models.BooleanField()
    is_downloaded = models.BooleanField()
    is_read = models.BooleanField()

    is_deleted= models.BooleanField(default=False)
    
    class Meta:
        db_table = "Books"


 

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

Ответ №1:

Проблема связана с несколькими экземплярами в вашем коде, когда вы вызываете что-то вроде:

 book_category__icontains 
 

Как вы можете видеть из вашей модели, у вас нет book_category поля, у вас есть book_category_no поле.

Но прежде чем пытаться изменить это, вы можете переименовать поля своей модели. Вот несколько примеров. Хорошие имена значительно упростят отладку.

 class Category(models.Model):
    # book_category_no = models.AutoField(primary_key=True) # no need for this.
    # book_category = models.CharField(max_length=100)
    name = models.CharField(max_length=100

    class Meta:
        db_table = "Category"

class Books(models.Model):
    #book_id = models.AutoField(primary_key=True)# no need for this
    title = models.CharField(max_length = 100)
    author= models.ForeignKey(Author, on_delete=models.CASCADE)# do not use author_id, use just author
    # similarly: 
    cover = models.ImageField(upload_to='media/')
    file = models.FileField(upload_to='media/')
    year = models.DateField()
    tags = models.CharField(max_length = 100)
    summary = models.CharField(max_length = 100)
    #when referring foreignkey, no need to add _no or _id after the name.
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    date_added = models.DateField(default=timezone.now)
    # book_info = models.CharField(max_length = 100, default="")
    is_bookmarked = models.BooleanField()
    is_downloaded = models.BooleanField()
    is_read = models.BooleanField()

    is_deleted= models.BooleanField(default=False)
    
    class Meta:
        db_table = "Books"

 

Комментарии:

1. вау, большое вам спасибо! Это сработало! Я последую тем советам, которые вы сказали об именах.