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

2023-12-19

我正在使用 Django 2.1 版本。

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

可以在 Django 中实现吗?


是的,举例来说,你有一个蛞蝓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']
        )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将第二个 slug 添加到 Django 中的 URL 路径? 的相关文章

随机推荐