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

Как указать url адрес для views?

1.0 Junior🔥 231 комментариев
#Django

Комментарии (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>.

Как указать url адрес для views? | PrepBro