是的,举例来说,你有一个蛞蝓Author
,一个为一个Book
,您可以将其定义为:
# app/urls.py
from django.urls import path
from app.views import book_details
urlpatterns = [
path('book/<slug:author_slug>/<slug:book_slug>/', book_details),
]
然后视图看起来像:
# app/views.py
from django.http import HttpResponse
def book_details(request, author_slug, book_slug):
# ...
return HttpResponse()
因此该视图需要两个额外的参数author_slug
(作者的slug),以及book_slug
(这本书的标题)。
如果您这样查询/book/shakespeare/romeo-and-juliet
, then author_slug
将包含'shakespeare'
, and book_slug
将包含'romeo-and-juliet'
.
例如,我们可以使用以下命令查找该特定书籍:
def book_details(request, author_slug, book_slug):
my_book = Book.objects.get(author__slug=author_slug, slug=book_slug)
return HttpResponse()
Or in a DetailView
,通过覆盖get_object(..)方法 [Django-doc] https://docs.djangoproject.com/en/2.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_object:
class BookDetailView(DetailView):
model = Book
def get_object(self, queryset=None):
super(BookDetailView, self).get_object(queryset=queryset)
return qs.get(
author__slug=self.kwargs['author_slug'],
slug=self.kwargs['book_slug']
)
或对于所有视图(包括DetailView
),通过覆盖get_queryset
method:
class BookDetailView(DetailView):
model = Book
def get_queryset(self):
qs = super(BookDetailView, self).get_queryset()
return qs.filter(
author__slug=self.kwargs['author_slug'],
slug=self.kwargs['book_slug']
)