Django 自定义路由转换器

步骤

  1. 创建自定义转换器类

    • 必须定义 regex 属性(用于匹配参数)。
    • 必须实现 to_pythonto_url 方法。
      • to_python: 将匹配的参数转换为视图函数可用的 Python 数据。
      • to_url: 将数据转换为 URL 格式(用于反向解析)。
  2. 注册转换器

    • 使用 register_converter 将自定义转换器注册到 Django 的路由系统。
  3. 在路由中使用转换器

转换器导包
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/
相关推荐
落羽凉笙3 小时前
Python学习笔记(3)|数据类型、变量与运算符:夯实基础,从入门到避坑(附图解+代码)
笔记·python·学习
Quintus五等升3 小时前
深度学习①|线性回归的实现
人工智能·python·深度学习·学习·机器学习·回归·线性回归
天远Date Lab3 小时前
Python实战:对接天远数据手机号码归属地API,实现精准用户分群与本地化运营
大数据·开发语言·python
哈里谢顿4 小时前
Python异常链:谁才是罪魁祸首?一探"The above exception"的时间顺序
python
盖世英雄酱581364 小时前
Java 组长年终总结:靠 AI 提效 50%,25 年搞副业只赚 4k?
后端·程序员·trae
哈里谢顿4 小时前
验证 list() 会调用 `__len__` 方法的深度解析
python·django
+VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue在线音乐播放系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
vibag5 小时前
构建智能体与工具调用
python·语言模型·大模型·langgraph
小途软件5 小时前
高校宿舍访客预约管理平台开发
java·人工智能·pytorch·python·深度学习·语言模型
-dcr5 小时前
49.python自动化
运维·python·自动化