Можно ли добавить второй слаг к URL-адресу в Django?

Я использую Джанго версии 2.1.

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

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


person Ulvi    schedule 09.09.2018    source источник
comment
Да, конечно, это возможно. URL-адреса могут быть любыми.   -  person Daniel Roseman    schedule 09.09.2018
comment
не могли бы вы показать мне, как это сделать? Я могу только один slug для URL-адреса.   -  person Ulvi    schedule 09.09.2018
comment
@UlviDamirli: с какими проблемами вы сталкиваетесь, обобщая это для двух слагов?   -  person Willem Van Onsem    schedule 09.09.2018


Ответы (1)


Да, скажем, например, что у вас есть слаг для 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 (слаг для автора) и 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(author__slug=author_slug, slug=book_slug)
    return HttpResponse()

Или в 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(
            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']
        )
person Willem Van Onsem    schedule 09.09.2018
comment
Большое спасибо за ваш ответ. Это мне очень помогло. Можно ли это сделать с помощью общего подробного просмотра? Если да, то как? - person Ulvi; 09.09.2018
comment
Вы можете увидеть мой код здесь: stackoverflow.com/questions/52237787/ - person Ulvi; 09.09.2018
comment
@UlviDamirli: да, в гипотетическом ответе Book имеет внешний ключ author к классу Author, который содержит слаг. Поэтому, если у вас есть ссылка, вы можете использовать двойное подчеркивание, как обычно делаете с фильтрацией Django. - person Willem Van Onsem; 09.09.2018