Функция 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. Этот параметр передается всем вложенным маршрутам, соответственно нам не надо определять данный параметр во вложенных маршрутах