Короткий ответ
Django проходит список шаблонов urlpatterns сверху вниз и вызывает view, соответствующий первому совпавшему пути; порядок правил в urls.py важен.
Как это работает подробнее
При старте Django загружает модуль ROOT_URLCONF. На каждый запрос путь (без домена и query-string) сравнивается с path()/re_path() по порядку сверху вниз; первое совпадение вызывает связанный view, остальные правила не проверяются.
Пример кода
example.py
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path("articles/new/", views.article_create), # должен быть выше следующего правила
path("articles/<int:pk>/", views.article_detail),
]
# Запрос GET /articles/new/ должен вернуть страницу создания,
# а не упасть с ошибкой приведения "new" к int в article_detail.Что использовать на практике
- Практика. Более специфичные пути нужно располагать выше общих (например,
admin/иarticles/<slug:slug>/edit/— вышеarticles/<slug:slug>/), иначе общий шаблон «перехватит» запрос раньше. Для разделения на модули используютinclude().
Подводные камни
- Риск. Разработчики забывают, что порядок правил критичен, и удивляются, почему вызывается «не тот» view; также путают
path()(простой синтаксис конвертеров) сre_path()(regex).