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