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

问题描述 投票:1回答:1

我正在使用Django 2.1版。

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

是否有可能在Django中做到这一点?

django python-3.x django-2.0 django-2.1
1个回答
2
投票

是的,例如说你有一个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(..) method [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']
        )
© www.soinside.com 2019 - 2024. All rights reserved.