自定义 url 转换器五个步骤:
- 定义一个类。
- 在类中定义一个属性 regex ,这个属性是用来保存 url 转换器规则的正则表达式。
- 实现 to_python(self,value) 方法,将 url 中的值转换一下,然后传给视图函数的。
- 实现 to_url(self,value) 方法,做 url 反转的时候,将传进来的参数转换后拼接成一个正确的url。
- 将定义好的转换器,注册到django中。
- 例子:获取列表分类(/article/list/python+django+flask)
1 #在应用下新建converter.py文件 2 from django.urls import converters,register_converter 3 4 class CategoryConverter(): 5 regex = r'w+|(w++w+)+' 6 7 def to_python(self,value): 8 #python+django+flask 9 #['python','django','flask'] 10 result = value.split("+") 11 return result 12 13 def to_url(self,value): 14 #value:['python','django','flask'] 15 #python+django+flask 16 if isinstance(value,list): 17 reslut = '+'.join(value) 18 return reslut 19 else: 20 raise RuntimeError('转换url的时候,分类参数必须为列表') 21 22 register_converter(CategoryConverter,'cate')
1 #应用的urls.py 2 from django.urls import path,re_path 3 from . import views 4 5 urlpatterns = [ 6 path('',views.article), 7 #w: 0-9 a-z A-Z 8 #re_path(r'list/(?P<categories>w+|(w+ +w+)+)/',views.article_list) 9 path('list/<cate:categories>/',views.article_list,name='list'), 10 path('detail/<int:article_id>/',views.article_detail,name='detail') 11 ]
1 #应用的views.py 2 from django.http import HttpResponse 3 from django.shortcuts import reverse,redirect 4 5 def article(request): 6 return HttpResponse('文章首页') 7 8 #定义文章列表函数,参数:分类 9 def article_list(request,categories): 10 text = '您填写的分类是:%s' % categories 11 return HttpResponse(text) 12 13 def article_detail(request,article_id): 14 reverse('detail',kwargs={'article_id':article_id}) 15 return HttpResponse('文章详情')
1 #应用的__init__.py文件 2 from . import converters
1 #项目的urls.py文件 2 from django.urls import path,include 3 4 urlpatterns = [ 5 path('',include('article.urls')), 6 path('article/',include('article.urls')) 7 ]
-
一个匹配四个数字年份的 url 转换器。示例代码如下:
1 # 定义一个类 2 class FourDigitYearConverter: 3 regex = '[0-9]{4}' 4 5 def to_python(self, value): 6 return int(value) 7 8 def to_url(self, value): 9 return '%04d' % value 10 11 # 注册到django中 12 from django.urls import register_converter 13 register_converter(converters.FourDigitYearConverter, 'yyyy') 14 urlpatterns = [ 15 path('articles/2003/', views.special_case_2003), 16 # 使用注册的转换器 17 path('articles/<yyyy:year>/', views.year_archive), 18 ... 19 ]