Получили ошибку "Ни одна книга не соответствует заданному запросу", даже если объект существует на 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 должен существовать. Но при отправке формы, книги не существует.
У кого-нибудь есть идеи по поводу возникновения этой ошибки?
Спасибо