Привет! В прошлых статьях мы создали проект и приложение. Теперь давай разберёмся, как Django направляет пользователя по нужным страницам — это называется маршрутизацией URL.
В этой статье мы разберём:
- Что такое маршрутизация URL
- Функция
path()и конвертеры - Функция
re_path()и регулярные выражения - Функция
include()для подключения URL
- Что нужно знать перед началом
- Основная часть
- Что такое маршрутизация URL
- Функция path()
- Конвертеры путей
- Функция re_path()
- Функция include()
- Именованные маршруты (name)
- Полный пример
- Задачи для закрепления
- Нюансы и подводные камни
- Порядок маршрутов
- Имена маршрутов
- include() с пространством имён
- Частые ошибки и как их избежать
- Ошибка 1: Неправильный порядок маршрутов
- Ошибка 2: Забыл импортировать include
- Ошибка 3: Неправильный синтаксис регулярного выражения
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Django
- Созданный проект и приложение
Совет: Маршрутизация — это «карта» сайта. Она связывает URL с представлениями (views).
Основная часть
Что такое маршрутизация URL
Маршрутизация URL — это процесс сопоставления URL-адресов с представлениями (views).
Когда пользователь переходит по ссылке, Django проходит по списку urlpatterns и ищет первый подходящий маршрут.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'), # Главная
path('about/', views.about, name='about'), # О нас
path('posts/', views.posts, name='posts'), # Посты
]Функция path()
path() — это основной способ создания маршрутов в Django.
Синтаксис:
path(путь, представление, имя_маршрута)Примеры:
from django.urls import path
from . import views
urlpatterns = [
# Простой маршрут
path('', views.index, name='index'),
# Маршрут с текстом
path('about/', views.about, name='about'),
# Маршрут с параметром
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
]Конвертеры путей
Конвертеры позволяют передавать параметры из URL в представление.
| Конвертер | Тип | Пример |
|---|---|---|
str | Строка (по умолчанию) | <str:name> |
int | Целое число | <int:post_id> |
slug | Slug (буквы, цифры, дефис, подчёркивание) | <slug:slug> |
uuid | UUID | <uuid:uuid> |
path | Путь с слешами | <path:path> |
Примеры:
# Целое число
path('post/<int:post_id>/', views.post_detail, name='post_detail')
# Строка
path('user/<str:username>/', views.user_profile, name='user_profile')
# Slug
path('article/<slug:article_slug>/', views.article_detail, name='article_detail')В представлении:
def post_detail(request, post_id):
# post_id — это int
return HttpResponse(f"Пост №{post_id}")Функция re_path()
re_path() позволяет использовать регулярные выражения для создания более гибких маршрутов.
Синтаксис:
from django.urls import re_path
urlpatterns = [
re_path(r'^article/(?P<year>[0-9]{4})/$', views.year_archive, name='year_archive'),
]Пример с регулярным выражением:
from django.urls import re_path
from . import views
urlpatterns = [
# Год из 4 цифр
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
# Месяц из 2 цифр
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
# Строка из букв
re_path(r'^hello/(?P<name>[a-zA-Z]+)/$', views.hello_name),
]В представлении:
def year_archive(request, year):
# year — строка, но можно преобразовать в int
return HttpResponse(f"Архив за {year} год")Важно:
re_path()полезен для сложных маршрутов, но для большинства задач достаточноpath().
Функция include()
include() используется для подключения URL-маршрутов из других файлов (обычно из приложений).
Структура проекта:
myproject/
mysite/
urls.py # Главный файл маршрутов
polls/ # Приложение
urls.py # Маршруты приложенияГлавный urls.py:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls')), # Подключаем маршруты приложения
path('blog/', include('blog.urls')), # Подключаем маршруты блога
]Файл urls.py в приложении polls:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'), # /polls/
path('<int:question_id>/', views.detail, name='detail'), # /polls/1/
]Совет:
include()делает проект модульным. Каждое приложение управляет своими маршрутами.
Именованные маршруты (name)
name позволяет ссылаться на маршрут по имени, а не по URL. Это удобно при изменении URL.
# urls.py
path('posts/', views.post_list, name='post_list')
path('posts/<int:post_id>/', views.post_detail, name='post_detail')Использование в шаблонах:
<a href="{% url 'post_list' %}">Все посты</a>
<a href="{% url 'post_detail' post_id=1 %}">Пост №1</a>Использование в представлениях:
from django.urls import reverse
url = reverse('post_detail', kwargs={'post_id': 1})
# /posts/1/Полный пример
mysite/urls.py:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')), # Главная страница
path('polls/', include('polls.urls')), # Опросы
]polls/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
path('<int:question_id>/results/', views.results, name='results'),
]blog/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
path('<int:post_id>/', views.post_detail, name='post_detail'),
]Задачи для закрепления
Задача 1. Создай маршрут для страницы с постами: /posts/.
Задача 2. Создай маршрут для страницы с постом: /posts/1/.
Задача 3. Подключи URL приложения через include().
Задача 4. Создай маршрут с параметром через re_path().
Задача 5. Напиши представление для маршрута с параметром.
Ответы:
Задача 1.
path('posts/', views.posts, name='posts')Задача 2.
path('posts/<int:post_id>/', views.post_detail, name='post_detail')Задача 3.
path('polls/', include('polls.urls'))Задача 4.
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)Задача 5.
def year_archive(request, year):
return HttpResponse(f"Архив за {year} год")Нюансы и подводные камни
Порядок маршрутов
Порядок маршрутов важен. Более конкретные маршруты должны идти раньше общих.
# Правильно
path('posts/new/', views.new_post, name='new_post'),
path('posts/<int:post_id>/', views.post_detail, name='post_detail'),
# Неправильно (new/ не будет достигнуто)
path('posts/<int:post_id>/', views.post_detail, name='post_detail'),
path('posts/new/', views.new_post, name='new_post'),Имена маршрутов
Имена маршрутов должны быть уникальными в пределах проекта.
include() с пространством имён
path('polls/', include('polls.urls', namespace='polls'))Частые ошибки и как их избежать
Ошибка 1: Неправильный порядок маршрутов
Сначала конкретные, потом общие.
Ошибка 2: Забыл импортировать include
from django.urls import include, path
Ошибка 3: Неправильный синтаксис регулярного выражения
Проверяй регулярные выражения в re_path().
Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Простой маршрут | path('about/', views.about) |
| Маршрут с параметром | path('post/<int:post_id>/', views.post_detail) |
| Маршрут с именем | path('', views.index, name='index') |
| Регулярное выражение | re_path(r'^article/([0-9]{4})/$', views.article) |
| Подключение приложения | path('polls/', include('polls.urls')) |
Заключение
Сегодня мы:
- Разобрали маршрутизацию URL в Django
- Изучили
path(),re_path(),include() - Узнали о конвертерах и регулярных выражениях
- Создали именованные маршруты








