Вложенные маршруты и функция include

Последнее обновление: 15.08.2022

Функция 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.

Вложенные маршруты и функция include в Django и Python

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

Вложенные маршруты и параметры родительских маршрутов в Django и Python
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850