Я использую Джанго версии 2.1.
Я хочу создать URL-адрес такого типа в своем проекте: www.example.com/bachelor/germany/university-of-frankfurt/corporate-finance
Возможно ли это сделать в Джанго?
Я использую Джанго версии 2.1.
Я хочу создать URL-адрес такого типа в своем проекте: www.example.com/bachelor/germany/university-of-frankfurt/corporate-finance
Возможно ли это сделать в Джанго?
Да, скажем, например, что у вас есть слаг для 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']
)
Book
имеет внешний ключ author
к классу Author
, который содержит слаг. Поэтому, если у вас есть ссылка, вы можете использовать двойное подчеркивание, как обычно делаете с фильтрацией Django.
- person Willem Van Onsem; 09.09.2018