← Назад к вопросам

Как работает функция path в Django?

1.3 Junior🔥 161 комментариев
#Django

Комментарии (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 приложениях.

Как работает функция path в Django? | PrepBro