django自定义URL(PATH)转换器

应用场景

当我们需要用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了,链接点击这里

写在最后

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值