Как передать bookinstance.id для конкретной книги в функционально-ориентированное представление в Django? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть приложение библиотеки 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 для просмотра.

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

(Опубликован ответ от имени автора вопроса) .

Вот решение:

   <form method="POST" action ="{% url 'borrow_book' copy.id%}" enctype="multipart/form-data">. 
   # use copy.id to get instance of that book
0 голосов
/ 14 декабря 2018

Пожалуйста, попробуйте:

action ="{% url 'borrow_book' copy.id%}"

copy кажется единственным экземпляром вашей итерации.

{% for copy in book.bookinstance_set.all %}
...