django自定义URL(PATH)转换器

本文介绍如何在Django中创建自定义URL转换器,实现不同数据类型如list、int等在URL中的传递,并通过实例演示从创建到使用的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用场景

当我们需要用url传递一些参数的时候,我们用<变量>来进行传参,例如下面代码:
path('tiaozhuan/<herolist>', views.tiaozhuan, name='gohere'),
但是url是一个字符串类型,我们如果想讲参数以int类型,list类型传进去呢,这个时候就需要自定义url转换器了,如下:
path('getlist/<cate:hero_name>/', views.get_list, name='list1'),
这个cate类型等会讲,这个是我自定义的一个将str转list类型的转换器
当然转换器是可以互相转化的,reserve函数也可以同时调用转化器完成转换

django内置的转换器

django有好多内置的转换器,这个工作原理就是在url字符串类型(访问网站)和其他类型(传参进函数进行运算)之间相互转换
如果有不明白推荐大家打开converters方法的源文件进行查看,我们可以看到两个函数to_python和to_str就是完成的这个工作,如下:

class IntConverter:
    regex = '[0-9]+'

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return str(value)

导入内置的转换器:from django import converters

  • str:除了斜杠/以外所有的字符都是可以的。
  • int:只有是一个或者多个的阿拉伯数字。
  • path:所有的字符都是满足的。
  • uuid:只有满足uuid.uuid4()这个函数返回的字符串的格式。
  • slug:英文中的横杆或者英文字符或者阿拉伯数字或者下划线才满足。

转换器的制作

我们已经了解它的应用场景和原理了,现在我们自己来制作一个转换器,一共有4步

  • first step
    我们要在你需要这个转换器的app文件夹下新建一个文件名为:converters.py
  • second step
    在这个文件写入转换器转换的规则例如下:
from django.urls import converters,register_converter
#这个类的用处就是在浏览器中url只能为str类型,而reserve传参需要将其他类型变成str类型,
#同理,将url中的字符串中的数据当做参数传入函数运算时需要变成其他相应类型。
#自定义url转换器,在这里我们将 liabi+luban+pangu 一类的字符串和列表之间进行相互转化
class CategoryConverter(object):
   regex = r'\w+|(\w+\+\w+)+'

   def to_python(self, value):
   	#将字符串转化为参数
   	#libai+luban+pangu
   	#['libai','luban','pangu']
   	result = value.split("+")
   	return result

   def to_url(self, value):
   	#反过来,用于reverse反转函数传参
   	if isinstance(value, list):
   		result = "+".join(value)
   		return result
   	else:
   		raise RuntimeError("转化url的时候,分类参数必须为列表!")
#注册上面写的类
register_converter(CategoryConverter, 'cate')

这里演示的是将libai+luban+pangu这一类字符串(中间带+号或者单个字符串)进行匹配,regex为正则表达式
register_converter:用来注册写好的这个类

third step超级重要,不然run不了别骂我
  • third step
    我们现在写好了这个转换器类了,也注册了,下一步应该是最重要的,就是在这个app文件夹下面的__init__.py中导入这个转换器py文件
  • forth step
    在views.py文件中写入函数代码:
from django.shortcuts import render, reverse, redirect
from django.http import HttpResponse
# Create your views here.

def index(request):
	return HttpResponse("这是首页")

def get_list(request, hero_name):
	print("hero_name:%s"%hero_name)
	print(reverse('list1',kwargs={"hero_name":hero_name}))
	print(type(hero_name))
	return HttpResponse("得到英雄列表为%s"%hero_name)

在urls.py文件中写入路由代码

from django.urls import path,re_path
from . import views
#from django.urls import converters,register_converter

urlpatterns=[
   path('', views.index),
   path('getlist/<cate:hero_name>/', views.get_list, name='list1'),
]

参考源代码我放到GitHub了,链接点击这里

写在最后

有疑问可以给我留言,欢迎一起交流进步

Django中,如果自定义了路由转换器(也称为URL处理器函数),并且代码本身没有错误,但是遇到“当前路径不匹配”(404 Not Found)的问题,可能是以下几个原因: 1. **URL配置未包含转换器**:确保你在`urls.py`文件中正确地应用了自定义转换器。例如,如果你有一个名为`MyCustomConverter`的转换器,你应该像这样添加到路由模式中: ```python path('<my_custom_converter:slug>/', views.my_view, name='my_view'), ``` 2. **转换器名称拼写或导入错误**:确认你使用的转换器名称在视图函数、URL配置以及相应的导入语句中都是一致的。 3. **转换器实现有误**:检查转换器函数是否能正确处理传入的字符串,并返回正确的正则表达式结果。如果该函数出现问题,可能会导致路由无法匹配。 4. **URL模式没有包含所有必需的部分**:确保你的URL模式完全匹配你要访问的页面结构。比如,如果需要一个动态的数字ID,确保你已经指定了这个部分。 5. **中间件设置**:某些中间件如`CommonMiddleware`可能会干扰URL匹配。检查中间件顺序,确保自定义转换器能够正常工作。 6. **浏览器缓存**:有时清除浏览器缓存可能会解决临时的URL匹配问题。 为了解决这个问题,你可以按照上述步骤逐一排查,或者在`views.py`中添加调试信息来确定问题出在哪里。同时,不要忘记检查日志文件(通常是`django.log`)以获取更详细的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值