У меня есть приложение библиотеки Django, в котором клиент может просматривать книгу из списка книг (и перенаправляется на страницу book_detail.html) и, если книга доступна, может заимствовать книгу.
book_detail.html - кнопка заимствования книги
{% for copy in book.bookinstance_set.all %}
{% if copy.status == 'a' %}
# <form method="POST" action ="{% url 'borrow_book' book_instance.id%}" enctype="multipart/form-data">
<form method="POST" action ="{% url 'borrow_book' copy.id%}" enctype="multipart/form-data">
{% csrf_token %}
<button type="submit" class="btn btn-success">Borrow the book</button>
</form>
{% endif %}
{% endfor %}
Это маршрутизация urls.py в проекте приложения
path('book/<uuid:pk>/borrow/', views.borrow_book, name='borrow_book'),
Ивызывается функция loan_book:
def borrow_book(request, pk):
book_instance = get_object_or_404(BookInstance, pk=pk)
if request.method == 'POST':
if request.user.is_authenticated:
book_instance.borrower = request.user
book_instance.due_back = datetime.date.today() + datetime.timedelta(weeks=3)
book_instance.status = STATUS_ON_LOAN
book_instance.save()
return HttpResponseRedirect(reverse('dashboard_customer'))
context = {
'book_instance': book_instance,
}
return render(request, 'catalog/book_detail.html', context)
Когда пользователь нажимает кнопку «Заимствовать книгу», мне нужно создать экземпляр книги, поэтому я использую модель book_instance.
Вот соотношение междумодель Book и BookInstance:
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
class BookInstance(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular book across whole library')
book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True)
due_back = models.DateField(null=True, blank=True)
borrower = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
STATUS_MAINTENANCE = 'm'
STATUS_ON_LOAN = 'o'
STATUS_AVAILABLE = 'a'
STATUS_RESERVED = 'r'
LOAN_STATUS = (
(STATUS_MAINTENANCE, 'Maintenance'),
(STATUS_ON_LOAN, 'On loan'),
(STATUS_AVAILABLE, 'Available'),
(STATUS_RESERVED, 'Reserved'),
)
status = models.CharField(
max_length=1,
choices=LOAN_STATUS,
blank=True,
default='m',
help_text='Book availability',
)
При нажатии кнопки loan_button я сталкиваюсь с ошибкой:
NoReverseMatch at /catalog/book/16
Reverse for 'borrow_book' with no arguments not found. 1 pattern(s) tried: ['catalog/book/(?P<pk>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/borrow/$']
Request Method: GET
Итак, в book-detail.html как мне пройти (каким образом) book_instance.id для просмотра.