自制URL转换器

 

自定义 url 转换器五个步骤:

 

  1. 定义一个类。
  2. 在类中定义一个属性  regex  ,这个属性是用来保存 url 转换器规则的正则表达式。
  3. 实现  to_python(self,value)  方法,将 url 中的值转换一下,然后传给视图函数的。
  4. 实现  to_url(self,value)  方法,做 url 反转的时候,将传进来的参数转换后拼接成一个正确的url
  5. 将定义好的转换器,注册到django中。
  6. 例子:获取列表分类(/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\w+|(\w+\ +\w+)+)/',views.article_list)
     9     path('list//',views.article_list,name='list'),
    10     path('detail//',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 ]

  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//', views.year_archive),
    18 ...
    19 ]

     

     




转载于:https://www.cnblogs.com/liqiongming/p/10296530.html

你可能感兴趣的:(自制URL转换器)