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

标签 django python-3.x django-2.0 django-2.1

我使用的是 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/

相关文章:

python - 发送到使用 contextlib.contextmanager 定义的上下文管理器

python-3.x - python模块 'signal'没有属性 'SIGHUP'和其他信号

regex - 将 url(r'^(?P<pk>[-\w]+)/$') 解码为 Django 中的 path()

mysql - 如何让 django 1.5 测试使用 mysql?

python - 在 Django 中向用户添加自定义字段

python - 从 PyCharm IDE 运行 Django 项目时出现 "ImportError: No module named cv2"

python-3.x - python : finding all pallindromic sequences of length k that sum to n

django - 如果在 Django(使用 PostgreSQL 数据库)中超过 5 分钟(否则为 0),则以秒为单位获取记录的年龄

python - 模块未找到错误 : No module named 'pip.download' when trying to install Python package for Django

python - 使用 django 2 添加类别的 url