Функция include() позволяет определить вложенные маршруты или подмаршруты для некоторого маршрута. В качестве параметра она принимает набор маршрутов:
include(pattern_list)
Параметр pattern_list представляет набор вызовов функций path() и/или re_path(). Например,
определеим в файле views.py следующие функции:
from django.http import HttpResponse
def index(request):
return HttpResponse("Главная страница")
def products(request):
return HttpResponse("Список товаров")
def new(request):
return HttpResponse("Новые товары")
def top(request):
return HttpResponse("Наиболее популярные товары")
Здесь последние три функции функционально относятся к товарам.
И определим в файле urls.py следующие маршруты:
from django.urls import path, include
from hello import views
product_patterns = [
path("", views.products),
path("new", views.new),
path("top", views.top),
]
urlpatterns = [
path("", views.index),
path("products/", include(product_patterns)),
]
Здесь в виде переменной product_patterns отдельно определен набор маршрутов, который касается
товаров.
Для установки этих маршрутов этот список передается в функцию include()
path("products", include(product_patterns)),
Причем этот список будет ассоциирован с шаблоном "product". В этом случае шаблоны вложенных маршрутов будут объединены с шаблоном родительского маршрута, и таким образом будет сформирован общий шаблон, которому должен соответствовать запрос.
Например, если придет запрос "http://127.0.0.1:8000/products/top", то он будет обрабатываться функцией top.
Таким образом, мы можем сгруппировать маршруты для запросов, которые начинаются с определенного шаблона. Что также позволяет избежать повтора частей шаблона, когда шаблон url начинается с одного и того же сегмента.
Вложенные маршруты получают параметры, определенные в родительских маршрутах. Например, определим в файле views.py следующие функции-представления:
from django.http import HttpResponse
def index(request):
return HttpResponse("Главная страница")
def products(request, id):
return HttpResponse(f"Товар {id}")
def comments(request, id):
return HttpResponse(f"Комментарии о товаре {id}")
def questions(request, id):
return HttpResponse(f"Вопросы о товаре {id}")
Здесь все функции кроме первой имеют второй параметр - id - условный номер товара.
Изменим файл urls.py:
from django.urls import path, include
from hello import views
product_patterns = [
path("", views.products),
path("comments", views.comments),
path("questions", views.questions),
]
urlpatterns = [
path("", views.index),
path("products/<int:id>/", include(product_patterns)),
]
Здесь для второго маршрута определяется числовой параметр id. Этот параметр передается всем вложенным маршрутам, соответственно нам не надо определять данный параметр во вложенных маршрутах