是否可以在 Django 中的 URL 路径中添加第二个 slug?



我正在使用Django 2.1版本。

我想在我的项目中创建这种类型的 URL 路径: www.example.com/bachelor/germany/university-of-frankfurt/corporate-finance

可以在 Django 中做到这一点吗?

是的,例如,假设您有一个用于Author的 slug,以及一个用于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(书籍的 slug(。

如果因此查询/book/shakespeare/romeo-and-juliet,则author_slug将包含'shakespeare'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()

或者在DetailView中,通过覆盖get_object(..)方法[Django-doc]:

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方法:

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']
)

最新更新