博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django自定义URL(PATH)转换器
阅读量:3909 次
发布时间:2019-05-23

本文共 2384 字,大约阅读时间需要 7 分钟。

应用场景

当我们需要用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文件夹下新建一个文件名为:
  • 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, redirectfrom 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_pathfrom . import views#from django.urls import converters,register_converterurlpatterns=[   path('', views.index),   path('getlist/
/', views.get_list, name='list1'),]

参考源代码我放到GitHub了,链接

写在最后

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

转载地址:http://hfkrn.baihongyu.com/

你可能感兴趣的文章
dotNET:怎样处理程序中的异常(实战篇)?
查看>>
What is 测试金字塔?
查看>>
api接口返回动态的json格式?我太难了,尝试一下 linq to json
查看>>
.Net Core HttpClient处理响应压缩
查看>>
十分钟搭建自己的私有NuGet服务器-BaGet
查看>>
efcore 新特性 SaveChanges Events
查看>>
龙芯3A5000初样顺利交付流片
查看>>
用了Dapper之后通篇还是SqlConnection,真的看不下去了
查看>>
ABP快速开发一个.NET Core电商平台
查看>>
[NewLife.Net]单机400万长连接压力测试
查看>>
使用Azure人脸API对图片进行人脸识别
查看>>
快醒醒,C# 9 中又来了一堆关键词 init,record,with
查看>>
【招聘(深圳)】轻岁 诚聘.NET Core开发
查看>>
await,async 我要把它翻个底朝天,这回你总该明白了吧
查看>>
.NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
查看>>
使用Jenkins来发布和代理.NetCore项目
查看>>
欢迎来到 C# 9.0(Welcome to C# 9.0)
查看>>
Dapr微服务应用开发系列1:环境配置
查看>>
使用 Visual Studio 2019 批量添加代码文件头
查看>>
【BCVP更新】StackExchange.Redis 的异步开发方式
查看>>