首页 > 解决方案 > 如何将特定书籍的 bookinstance.id 传递给 Django 中的基于函数的视图?

问题描述

我有一个 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'),

并调用了函数 borrow_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',
  ) 

单击borrow_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 传递给视图。

标签: djangodjango-modelsdjango-views

解决方案


请试试:

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

copy似乎是您迭代的单个实例。

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

推荐阅读