Короткий ответ
В шаблоне пути используется конвертер <int:pk>, который сразу приводит значение к int; Django передаёт его в view как аргумент с тем же именем, что указано в угловых скобках.
Как это работает подробнее
Django поддерживает встроенные конвертеры путей: str, int, slug, uuid, path. Конвертер не только извлекает часть URL, но и валидирует/приводит тип — если в URL не число, int-конвертер просто не совпадёт, и Django перейдёт к следующему правилу (или вернёт 404).
Пример кода
example.py
# urls.py
from django.urls import path
from . import views
urlpatterns = [path("articles/<int:pk>/", views.article_detail)]
# views.py
def article_detail(request, pk):
# pk уже int, например 42
return HttpResponse(f"Статья #{pk}")
# GET /articles/42/ -> "Статья #42"
# GET /articles/abc/ -> 404, т.к. "abc" не подходит под <int:>Что использовать на практике
- Практика. Имя переменной в
<int:pk>должно совпадать с именем параметра view-функции (def article_detail(request, pk):). Это избавляет от ручногоint(request_path_part)и связанных с этим try/except.
Подводные камни
- Риск. Несовпадение имени параметра в шаблоне и в сигнатуре функции (например,
<int:pk>в URL, ноidв функции) приводит кTypeErrorпри вызове view; использованиеstrвместоintтам, где нужна числовая валидация.