Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Маршрутизация в Django: URL routing
В Django URL адреса для views определяются в файле urls.py. Это основной механизм маршрутизации приложения.
Структура URL конфигурации
# myproject/urls.py - главный конфиг
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("api/v1/", include("api.urls")), # Подключение URL приложения
path("blog/", include("blog.urls")),
]
# api/urls.py - URL приложения
from django.urls import path
from . import views
app_name = "api" # Namespace для реверса
urlpatterns = [
path("users/", views.UserListView.as_view(), name="user-list"),
path("users/<int:pk>/", views.UserDetailView.as_view(), name="user-detail"),
path("users/<str:username>/", views.UserByUsernameView.as_view(), name="user-by-username"),
]
Различные способы определения маршрутов
from django.urls import path, re_path
from . import views
urlpatterns = [
# Простой путь
path("articles/", views.article_list, name="article-list"),
# С целым числом (integer)
path("articles/<int:article_id>/", views.article_detail, name="article-detail"),
# С UUID
path("articles/<uuid:uuid>/", views.article_by_uuid, name="article-by-uuid"),
# Со строкой
path("users/<str:username>/", views.user_profile, name="user-profile"),
# С slug
path("posts/<slug:slug>/", views.post_by_slug, name="post-by-slug"),
# С регулярными выражениями
re_path(r"^articles/(?P<year>[0-9]{4})/$", views.articles_by_year, name="articles-by-year"),
]
Использование path converters
# Пример с несколькими параметрами
urlpatterns = [
path("blog/<int:year>/<int:month>/<slug:slug>/", views.post_detail, name="post-detail"),
path("products/<uuid:product_id>/reviews/<int:review_id>/", views.review_detail, name="review-detail"),
]
Создание функциональных и классовых views
# views.py
from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from django.views.generic import ListView, DetailView
from .models import Article
# Функциональный view
def article_list(request):
articles = Article.objects.all()
return render(request, "articles/list.html", {"articles": articles})
def article_detail(request, article_id):
article = Article.objects.get(id=article_id)
return render(request, "articles/detail.html", {"article": article})
# Классовый view
class ArticleListView(ListView):
model = Article
template_name = "articles/list.html"
context_object_name = "articles"
paginate_by = 10
class ArticleDetailView(DetailView):
model = Article
template_name = "articles/detail.html"
context_object_name = "article"
pk_url_kwarg = "pk"
Обратное разрешение URL (URL reversing)
from django.urls import reverse
from django.http import HttpResponseRedirect
# В Python коде
detail_url = reverse("article-detail", kwargs={"article_id": 42})
# Результат: /articles/42/
# С namespace
detail_url = reverse("api:user-detail", kwargs={"pk": 1})
# Результат: /api/v1/users/1/
REST API маршруты
from django.urls import path
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register(r"users", views.UserViewSet, basename="user")
router.register(r"articles", views.ArticleViewSet, basename="article")
urlpatterns = [
path("", include(router.urls)),
]
# Автоматически создаёт маршруты:
# GET /api/v1/users/ - список
# POST /api/v1/users/ - создание
# GET /api/v1/users/{id}/ - деталь
# PUT /api/v1/users/{id}/ - обновление
# DELETE /api/v1/users/{id}/ - удаление
Приоритет маршрутов
Важно: Django обрабатывает маршруты по порядку! Более специфичные маршруты должны быть первыми:
urlpatterns = [
path("articles/new/", views.create_article, name="create-article"), # ПЕРВЫМ!
path("articles/<int:article_id>/", views.article_detail, name="article-detail"),
]
Если поменять порядок, маршрут articles/new/ никогда не сработает — перехватится параметр <article_id>.