Получили ошибку "Ни одна книга не соответствует заданному запросу", даже если объект существует на Django

У меня возникла проблема, когда Django возвращает "No Books matches the given query", даже если объект существует в базе данных.

Для контекста я хочу создать страницу обновления, не полагаясь на использование URL. Во-первых, вот моя модель :

User = get_user_model()
class Books(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
    title = models.CharField(max_length=50)
    author = models.CharField(
        max_length=40,
    )
    author_nationality = models.CharField(max_length=20, default='Japanese')
    author_medsos = models.CharField(max_length=30, default='None')
    book_type = models.CharField(
        max_length=10,
        null=True,
        choices=BOOKS_TYPES
    )
    tl_type = models.CharField(
        max_length=20,
        null=True, 
        choices=TRANSLATION_BY
    )
    series_status = models.CharField(
        max_length=20,
        choices=SERIES_STATUS,
        default=ONG
    )
    source = models.CharField(max_length=100) # source can refer to downloage page, example = https://www.justlightnovels.com/2023/03/hollow-regalia/
    reading_status = models.CharField(
        max_length=20,
        choices=READING_STATUS,
        default=TOR
    )
    current_progress = models.CharField( # For tracking how many chapter have been read
        max_length=30,
        null=True
    )
    cover = models.FileField(upload_to='cover/', default='cover/default.png')
    genre = models.CharField(max_length=40, null=True)

class Review(models.Model):
    books = models.ForeignKey('Books', on_delete=models.CASCADE, null=True)
    volume = models.IntegerField()
    review = models.TextField()

Прежде чем пользователь попадет на страницу обновления, он сначала должен посетить /library страницу,

{% for book in user_books %}
    <div class='lib-item'>
        <form method='POST' action="{% url 'core:update_library' %}">
            {% csrf_token %}
            <input type='hidden' name='book_id' value='{{ book.id }}'>
            <button type='submit'>
                <img src={{ book.cover.url }} width='185'>
                
                    <span>
                        {{ book.title }}
                    </span>
                
            </button>
        </form>
    </div>
{% endfor %}

Заметили скрытый ввод? Идея заключается в том, чтобы передать book.id на следующую страницу, которая является /library/update. Вот страница для /library/update :

{% block content %}   
<div class='content'>
    <h3>{{ book.title }} by {{ book.author }}</h3>
    <small> _id : {{ book_id }} </small>
    <small> id : {{ book }} </small>

    <form method='POST'>
        {% csrf_token %}
        {{ form.as_p }}
        <button type='submit'>submit</button>
    </form>
{% endblock %}

А вот views.py для обеих страниц

@login_required
def library(request):
    user = request.user
    user_books = user.books_set.all()
    context = {
        'user' : user,
        'user_books' : user_books
    }
    return render(request, 'user_library.html', context)

@login_required
def update_library(request):
    user = request.user

    book_id = request.POST.get('book_id')
    # book = user.books_set.get(pk=book_id)
    book = get_object_or_404(user.books_set, pk=book_id)

    if request.method == 'POST':
        form = UpdateBooks(request.POST, instance=book)
        if form.is_valid():
            form.save()

        context = {
            'book_id' : book_id,
            'book' : book,
            'form' : form
        }
        # messages.success(request, 'Library have been updated')
        # return HttpResponseRedirect('/library/update/')
        return render(request, 'user_update.html', context)
    else :
        context = {
            'book_id' : book_id,
            'book' : book
        }
        return render(request, 'user_update.html', context)

А форма с помощью ModelForm :

class AddBooks(forms.ModelForm):
    class Meta:
        model = Books
        exclude = ["owner"]

class UpdateBooks(forms.ModelForm):
    class Meta:
        model = Review
        exclude = ["books"]

Теперь, когда пользователь загружает страницу /library, она работает нормально. Когда пользователь выбирает книгу, он перенаправляется на /library/update, при этом id книги передается с помощью скрытого input. А /library/update способен корректно отобразить информацию о выбранной книге, включая id, объект, название и автора. Значит, id книги должен присутствовать, верно?

Но когда пользователь отправляет форму, страница возвращает ошибку: "Страница не найдена (404) Ни одна книга не соответствует заданному запросу".

Я запутался, почему ошибка говорит, что есть "Ни одна книга не соответствует заданному запросу". Я проверил страницу администрирования Django, и объект существует. Даже /library/update корректно отображает информацию о книгах, поэтому объект book должен существовать. Но при отправке формы, книги не существует.

У кого-нибудь есть идеи по поводу возникновения этой ошибки?

Спасибо

Вернуться на верх