Можно ли добавить 2-й слаг к URL-пути в Django? - PullRequest
0 голосов
/ 09 сентября 2018

Я использую Django версии 2.1.

Я хочу создать этот тип URL Path в моем проекте: www.example.com/bachelor/germany/university-of-frankfurt/corporate-finance

Возможно ли это сделать в Django?

1 Ответ

0 голосов
/ 09 сентября 2018

Да, скажем, например, что у вас есть слаг для Author и один для Book, вы можете определить его как:

# 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),
]

Тогда представление будет выглядеть так:

# app/views.py

from django.http import HttpResponse

def book_details(request, author_slug, book_slug):
    # ...
    return HttpResponse()

Таким образом, представление принимает два дополнительных параметра author_slug (слаг для автора) и book_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()

Или вa 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(
            <b>author__slug=self.kwargs['author_slug'],
            slug=self.kwargs['book_slug']</b>
        )

или для всех представлений (включая 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>
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...