Конвертер int
Конвертер int применяется в маршрутах Django для захвата целочисленных значений из URL и преобразования их в Python-объекты типа int. Он используется в функции path для определения динамических сегментов URL, которые должны быть целыми числами. Конвертер автоматически проверяет, что переданное значение является целым числом, и передает его в представление как аргумент типа int.
Синтаксис
from django.urls import path
from myapp.views import my_view
urlpatterns = [
path('articles/<int:article_id>/', my_view, name='article_detail'),
]
Пример
Давайте создадим представление, которое принимает целочисленный идентификатор статьи из URL:
from django.http import HttpResponse
from myapp.models import Article
def article_detail(request, article_id):
try:
article = Article.objects.get(id=article_id)
return HttpResponse(f"Article title: {article.title}")
except Article.DoesNotExist:
return HttpResponse("Article not found", status=404)
Результат выполнения кода при обращении к URL '/articles/42/':
"Article title: Django Basics"
Пример
Рассмотрим использование конвертера int с несколькими параметрами в одном URL:
from django.urls import path
from myapp.views import article_range
urlpatterns = [
path('articles/<int:start_id>/to/<int:end_id>/', article_range, name='article_range'),
]
Создадим представление, которое обрабатывает оба целочисленных параметра:
from django.http import HttpResponse
from myapp.models import Article
def article_range(request, start_id, end_id):
articles = Article.objects.filter(id__gte=start_id, id__lte=end_id)
titles = [article.title for article in articles]
return HttpResponse(f"Articles: {', '.join(titles)}")
Результат выполнения кода при обращении к URL '/articles/1/to/5/':
"Articles: Django Basics, Advanced Django, Django REST, Django Forms, Django Testing"
Пример
Используем конвертер int с параметрами в виде строки запроса:
from django.urls import path
from myapp.views import user_posts
urlpatterns = [
path('user/<int:user_id>/posts/', user_posts, name='user_posts'),
]
Создадим представление, которое использует идентификатор пользователя для получения постов:
from django.http import HttpResponse
from myapp.models import Post, User
def user_posts(request, user_id):
try:
user = User.objects.get(id=user_id)
posts = Post.objects.filter(author=user)
post_titles = [post.title for post in posts]
return HttpResponse(f"Posts by {user.username}: {', '.join(post_titles)}")
except User.DoesNotExist:
return HttpResponse("User not found", status=404)
Результат выполнения кода при обращении к URL '/user/3/posts/':
"Posts by john_doe: My First Post, Python Tips, Django ORM Guide"