我们首先来看一下django内置的转换器是什么样的?
从django的converters.py文件中
class IntConverter:
regex = '[0-9]+'
def to_python(self, value):
return int(value)
def to_url(self, value):
return str(value)
我们通过依葫芦画瓢的方式,构建自己的url格式转换器。
需求如下:
我们希望实现这样的功能:
当用户输入的url为python+django+flask
时,可以通过转换器转换成一个列表:['python','django','flask']
当获取的参数为列表['python','django','flask']
时可以通过converse
函数转换成python+django+flask
#自定义一个url path转换器
class Catergoryconverter(object):
#写一个正则,要求格式为“python+django+flask”
regex = r'\w+|(\w+\+\w+)+'
def to_python(self,value):
#value得到的字符串为:python+django+flask
result = value.split("+")
#拆分后是一个列表['python','django','flask']
return result
def to_url(self,value):
#value的格式为:["python","django","flask"]
#为了保持代码的健壮性,加一个判断,判断value的类型是否为list\
if isinstance(value,list):
result = "+".join(value)
#拼接后的result格式为:“python+django+flask”
return result
else:
raise RuntimeError("您输入的参数类型不合法,请输入一个列表")
#将写好的自定义一个url path转换器加入注册表中
register_converter(Catergoryconverter,'category')
写好后的用法参照原生的int``str
path的用法,
path('list/<category:categories>/',views.category),
最后的效果展示如下: