Django 自定义路由转换器
步骤
创建自定义转换器类
- 必须定义
regex
属性(用于匹配参数)。- 必须实现
to_python
和to_url
方法。
to_python
: 将匹配的参数转换为视图函数可用的 Python 数据。to_url
: 将数据转换为 URL 格式(用于反向解析)。注册转换器
- 使用
register_converter
将自定义转换器注册到 Django 的路由系统。在路由中使用转换器
转换器导包
from django.urls import converters
定义 一个匹配非数字的
# 导入StringConverter 转换器
from django.urls.converters import StringConverter# 继承StringConverter 直接定义或者修改方法
class NonumConverter(StringConverter):regex = r"[^\d]+" # 匹配一个或多个非数字字符def to_python(self, value):# URL 参数直接作为字符串返回return valuedef to_url(self, value):# 返回适合插入到 URL 中的字符串return value
全局注册
from django.urls.converters import DEFAULT_CONVERTERS# 注册转换器到全局转换器集合
DEFAULT_CONVERTERS['nonum'] = NonumConverter
局部注册
from django.urls import register_converterregister_converter(NonumConverter, 'nonum')
示例
创建转换器
假设需要自定义一个转换器 FourDigitYearConverter
,用于匹配四位年份。
# converters.pyclass FourDigitYearConverter:regex = r'\d{4}' # 匹配四位数字def to_python(self, value):return int(value) # 转换为整数def to_url(self, value):return f"{value:04d}" # 确保是四位数字
注册转换器
在 urls.py
中注册自定义转换器:
from django.urls import path, register_converter
from . import converters, views# 注册转换器
register_converter(converters.FourDigitYearConverter, 'yyyy')urlpatterns = [path('year/<yyyy:year>/', views.year_view, name='year'),
]
视图函数
from django.http import HttpResponsedef year_view(request, year):return HttpResponse(f"The year is {year}.")
反向解析
from django.urls import reverseurl = reverse('year', kwargs={'year': 2024})
print(url) # 输出:/year/2024/