在URLconf中,必须使用对象pk或slug来调用通用详细视图BookDetailView



我是django的新手。我在做一个项目
这是我的书详情查看::

class BookDetailView(generic.DetailView):
model = models.Book
template_name = 'catalog/book_detail.html'

这是我的renewbooklibririan,它在视图中定义::

def renew_book_librarian(request, pk):
"""
View function for renewing a specific BookInstance by librarian
"""
book_inst=get_object_or_404(models.BookInstance, pk = pk)

# If this is a POST request then process the Form data
if request.method == 'POST':

# Create a form instance and populate it with data from the request (binding):
form = RenewBookForm(request.POST)

# Check if the form is valid:
if form.is_valid():
# process the data in form.cleaned_data as required (here we just write it to the model due_back field)
book_inst.due_back = form.cleaned_data['renewal_date']
book_inst.save()

# redirect to a new URL:
return HttpResponseRedirect(reverse('catalog:my-borrowed') )

# If this is a GET (or any other method) create the default form.
else:
proposed_renewal_date = datetime.date.today() + datetime.timedelta(weeks=3)
form = RenewBookForm(initial={'renewal_date': proposed_renewal_date,})

return render(request, 'catalog/book_renew_librarian.html', {'form': form, 'bookinst':book_inst})

这是我的url模式:

urlpatterns = [
path('', views.Index.as_view(), name = "index"),
path('books/', views.BookListView.as_view(), name = "books"),
path('authors/', views.AuthorListView.as_view(), name = 'authors'),
path('book/<int:book_id>/', views.BookDetailView.as_view(), name = "book-detail"),
path('mybooks/', views.LoanedBooksByUserListView.as_view(), name = 'my-borrowed'),
path('book/<int:book_id>/renew/', views.renew_book_librarian, name='renew-book-librarian' )
]

我的代码一直在工作,直到在url中添加续订图书libririan。当我添加这个url时,我有这样的错误::(通用详细信息视图BookDetailView必须在URLconf中使用对象pk或slug调用。(

有人能帮我吗??!!

默认情况下,DetailView将查找名为pkslug的url参数以获取项目。但在这里,您将参数命名为book_id

但是,您可以在pk_url_kwarg[Django-doc]中指定url参数的名称:

class BookDetailView(generic.DetailView):
model = models.Book
pk_url_kwarg = 'book_id'
template_name = 'catalog/book_detail.html'

对于基于函数的视图,参数的名称应该是book_id:

def renew_book_librarian(request, book_id):
book_inst=get_object_or_404(models.BookInstance, pk=book_id)
# …

最新更新