我使用的是 Django 2.1 版本。
我想在我的项目中创建这种类型的 URL 路径: www.example.com/bachelor/germany/university-of-frankfurt/corporate-finance
可以在 Django 中实现吗?
最佳答案
是的,例如,您有一个作者
的slug,还有一个Book
的slug,您可以将其定义为:
# app/urls.py
from django.urls import path
from app.views import book_details
urlpatterns = [
path('book/<slug:<b>author_slug</b>>/<slug:<b>book_slug</b>>/', book_details),
]
然后 View 看起来像:
# app/views.py
from django.http import HttpResponse
def book_details(request, author_slug, book_slug):
# ...
return HttpResponse()
因此,该 View 需要两个额外的参数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(<b>author__slug=author_slug, slug=book_slug</b>)
return HttpResponse()
或者在 DetailView
中,通过覆盖 get_object(..)
method [Django-doc] :
class BookDetailView(DetailView):
model = Book
def get_object(self, queryset=None):
super(BookDetailView, self).get_object(queryset=queryset)
return qs.get(
<b>author__slug=self.kwargs['author_slug'],
slug=self.kwargs['book_slug']</b>
)
或者对于所有 View (包括DetailView
),通过重写get_queryset
方法:
class BookDetailView(DetailView):
model = Book
def get_queryset(self):
qs = super(BookDetailView, self).get_queryset()
return qs.filter(
<b>author__slug=self.kwargs['author_slug'],
slug=self.kwargs['book_slug']</b>
)
关于django - 是否可以将第二个 slug 添加到 Django 中的 URL 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52246161/