register_converter

Функция register_converter применяется для регистрации пользовательских конвертеров в системе маршрутизации Django. Она позволяет разработчику определять собственные типы данных, которые могут использоваться в параметрах URL, и автоматически преобразовывать их из строки в нужный тип Python. Функция принимает два обязательных аргумента: класс конвертера и строку с именем типа.

Синтаксис

pythonfrom django.urls import register_converter

register_converter(converter_class, type_name)

Параметры функции:

converter_class - класс конвертера, который определяет методы to_python и to_url для преобразования значений.

type_name - строка с именем типа, под которым конвертер будет доступен в функциях path и re_path.

Пример . С пользовательским конвертером

Давайте создадим конвертер для обработки дат в формате год-месяц-день:

pythonfrom 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')

После регистрации конвертера, мы можем использовать его в маршрутах:

pythonfrom 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:

pythonfrom django.http import HttpResponse

def post_by_date(request, pub_date):
  return HttpResponse(f"Posts published on: {pub_date}")

Результат выполнения кода при обращении по URL /post/2025-01-15/:

python"Posts published on: 2025-01-15"

Пример . С сложным конвертером

Создадим конвертер для работы с диапазонами чисел вида "10-20":

pythonfrom 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-адресах:

pythonfrom django.urls import path
from . import views

urlpatterns = [
  path('products/<range:price_range>/', views.products_by_price),
]

В представлении параметр будет передан как объект range:

pythonfrom 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/:

python"Product prices from 100 to 500"

Пример . С импортом в urls.py

Обычно регистрацию конвертеров выполняют в файле urls.py проекта или приложения:

pythonfrom 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-шаблонах приложения:

pythonfrom django.http import HttpResponse

def posts_by_year(request, year):
  return HttpResponse(f"Posts from {year}")

Результат выполнения кода при обращении по URL /posts/2025/:

python"Posts from 2025"

Смотрите также

  • функция path,
    которая используется для определения маршрутов с использованием конвертеров
  • функция re_path,
    которая определяет маршруты через регулярные выражения
  • конвертер int,
    встроенный конвертер для целых чисел
  • конвертер slug,
    встроенный конвертер для URL-совместимых строк