Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает функция path в Django
Функция path() в Django — это основной способ определения URL-маршрутов в приложении. Она отображает URL-паттерны на обработчики представлений.
Базовая структура и синтаксис
Импорт и базовое использование:
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.articles_list, name='articles_list'),
path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
path('articles/<slug:article_slug>/', views.article_by_slug, name='article_slug'),
]
Параметры функции path():
- route (первый аргумент): строка с URL-паттерном
- view (второй аргумент): view функция или класс
- kwargs (опционально): словарь дополнительных параметров
- name (опционально): имя URL-паттерна для reverse()
Типы параметров в path()
1. Целые числа (int)
path('articles/<int:id>/', views.article_detail, name='article_detail')
# Совпадает: /articles/42/, /articles/123/
# Не совпадает: /articles/abc/, /articles/42.5/
def article_detail(request, id):
article = Article.objects.get(id=id)
return render(request, 'article.html', {'article': article})
2. Строки (str) — по умолчанию
path('blog/<str:username>/', views.user_blog)
# Совпадает: /blog/john/, /blog/alice_wonderland/
def user_blog(request, username):
user = User.objects.get(username=username)
posts = Post.objects.filter(author=user)
return render(request, 'blog.html', {'posts': posts})
3. Slug (slug) — для URL-friendly строк
path('posts/<slug:slug>/', views.post_detail, name='post_detail')
# Совпадает: /posts/my-awesome-post/, /posts/django-tutorial/
def post_detail(request, slug):
post = Post.objects.get(slug=slug)
return render(request, 'post_detail.html', {'post': post})
4. UUID
path('users/<uuid:uuid>/', views.user_profile, name='user_profile')
# Совпадает: /users/f47ac10b-58cc-4372-a567-0e02b2c3d479/
def user_profile(request, uuid):
user = User.objects.get(uuid=uuid)
return render(request, 'profile.html', {'user': user})
Несколько параметров в одном маршруте
Множественные параметры:
path('users/<int:user_id>/posts/<int:post_id>/', views.user_post_detail, name='user_post_detail')
def user_post_detail(request, user_id, post_id):
user = User.objects.get(id=user_id)
post = Post.objects.get(id=post_id, author=user)
return render(request, 'post.html', {'post': post})
Использование view классов
Class-based views:
from django.views.generic import DetailView
class ArticleDetailView(DetailView):
model = Article
template_name = 'article_detail.html'
context_object_name = 'article'
pk_url_kwarg = 'article_id'
# urls.py
urlpatterns = [
path('articles/<int:article_id>/', ArticleDetailView.as_view(), name='article_detail'),
]
Именование URL-маршрутов и reverse()
Использование name для построения URL:
from django.urls import reverse
# В представлении
url = reverse('article_detail', kwargs={'id': 42})
# Результат: /articles/42/
# В шаблоне
<a href="{% url 'article_detail' id=article.id %}">{{ article.title }}</a>
Параметры функции path() — kwargs
Передача дополнительных параметров:
def article_list(request, category=None, featured=False):
if category:
articles = Article.objects.filter(category=category)
else:
articles = Article.objects.all()
if featured:
articles = articles.filter(featured=True)
return render(request, 'articles.html', {'articles': articles})
# urls.py
urlpatterns = [
path('articles/', article_list, name='all_articles'),
path('articles/featured/', article_list, {'featured': True}, name='featured_articles'),
path('articles/tech/', article_list, {'category': 'tech'}, name='tech_articles'),
]
Вложенные маршруты через include()
Включение других URL-конфигураций:
# myproject/urls.py
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('api/v1/', include('api.urls')),
path('blog/', include('blog.urls')),
]
# blog/urls.py
urlpatterns = [
path('', views.post_list, name='post_list'),
path('<int:post_id>/', views.post_detail, name='post_detail'),
path('<int:post_id>/edit/', views.post_edit, name='post_edit'),
]
# Результирующие URL:
# /blog/, /blog/1/, /blog/1/edit/
Порядок имеет значение
Правило первого совпадения:
urlpatterns = [
path('posts/latest/', views.latest_posts, name='latest'),
path('posts/<int:id>/', views.post_detail, name='detail'),
]
# Если переставить порядок, /posts/latest/
# будет обработан как /posts/<int:id>/
Конвертеры (Converters)
Создание собственного конвертера:
from django.urls.converters import StringConverter
from django.urls import register_converter
class YearConverter(StringConverter):
regex = '[0-9]{4}'
register_converter(YearConverter, 'year')
# Использование
urlpatterns = [
path('articles/year/<year:year>/', views.articles_by_year, name='articles_by_year'),
]
def articles_by_year(request, year):
articles = Article.objects.filter(created_at__year=year)
return render(request, 'articles.html', {'articles': articles})
Регулярные выражения (re_path)
Более гибкие маршруты:
from django.urls import re_path
re_path(
r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',
views.articles_by_month,
name='articles_by_month'
)
def articles_by_month(request, year, month):
articles = Article.objects.filter(
created_at__year=year,
created_at__month=month
)
return render(request, 'articles.html', {'articles': articles})
Лучшие практики
- Используй path() вместо re_path() когда возможно (более читаемо)
- Порядок маршрутов — от специфичных к общим
- Используй kwargs вместо query параметров для структурных данных
- Именуй маршруты — потом легче менять URL без изменения шаблонов
- Вложенность через include() — делает код организованным
- Slug для SEO — лучше чем ID для публичных страниц
Функция path() — мощный инструмент для построения гибкой и масштабируемой системы маршрутизации в Django приложениях.