register_converter
Функция register_converter применяется для регистрации пользовательских конвертеров в системе маршрутизации Django. Она позволяет разработчику определять собственные типы данных, которые могут использоваться в параметрах URL, и автоматически преобразовывать их из строки в нужный тип Python. Функция принимает два обязательных аргумента: класс конвертера и строку с именем типа.
Синтаксис
from django.urls import register_converter
register_converter(converter_class, type_name)
Параметры функции:
converter_class - класс конвертера, который определяет методы to_python и to_url для преобразования значений.
type_name - строка с именем типа, под которым конвертер будет доступен в функциях path и re_path.
Пример . С пользовательским конвертером
Давайте создадим конвертер для обработки дат в формате год-месяц-день:
from django.urls import register_converter, path
from datetime import datetime
class DateConverter:
regex = r'[0-9]{4}-[0-9]{2}-[0-9]{2}'
def to_python(self, value):
return datetime.strptime(value, '%Y-%m-%d').date()
def to_url(self, value):
return value.strftime('%Y-%m-%d')
register_converter(DateConverter, 'date')
После регистрации конвертера, мы можем использовать его в маршрутах:
from django.urls import path
from . import views
urlpatterns = [
path('post/<date:pub_date>/', views.post_by_date),
path('post/<date:pub_date>/<slug:slug>/', views.post_detail),
]
В представлении мы получим объект типа date:
from django.http import HttpResponse
def post_by_date(request, pub_date):
return HttpResponse(f"Posts published on: {pub_date}")
Результат выполнения кода при обращении по URL /post/2025-01-15/:
"Posts published on: 2025-01-15"
Пример . С сложным конвертером
Создадим конвертер для работы с диапазонами чисел вида "10-20":
from django.urls import register_converter, path
from django.http import HttpResponse
class RangeConverter:
regex = r'[0-9]+-[0-9]+'
def to_python(self, value):
start, end = value.split('-')
return range(int(start), int(end) + 1)
def to_url(self, value):
return f"{value.start}-{value.stop - 1}"
register_converter(RangeConverter, 'range')
Теперь можем использовать конвертер в URL-адресах:
from django.urls import path
from . import views
urlpatterns = [
path('products/<range:price_range>/', views.products_by_price),
]
В представлении параметр будет передан как объект range:
from django.http import HttpResponse
def products_by_price(request, price_range):
return HttpResponse(f"Product prices from {price_range.start} to {price_range.stop - 1}")
Результат выполнения кода при обращении по URL /products/100-500/:
"Product prices from 100 to 500"
Пример . С импортом в urls.py
Обычно регистрацию конвертеров выполняют в файле urls.py проекта или приложения:
from django.urls import register_converter, path
from django.contrib import admin
from . import views
class YearConverter:
regex = r'[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return str(value)
register_converter(YearConverter, 'year')
urlpatterns = [
path('admin/', admin.site.urls),
path('posts/<year:year>/', views.posts_by_year),
]
После регистрации конвертер становится доступным во всех URL-шаблонах приложения:
from django.http import HttpResponse
def posts_by_year(request, year):
return HttpResponse(f"Posts from {year}")
Результат выполнения кода при обращении по URL /posts/2025/:
"Posts from 2025"