第十五节 自定义path转换器

django中path解释器的原理解释
from django.urls import converters

# ctrl+b 打开converters.py,取其中一个类作为解释
class IntConverter:
    regex = '[0-9]+'
    # 定义的正则匹配规则

    def to_python(self, value):
        # 浏览器端返回的url传递到urls.py中进行匹配,符合匹配规矩,将参数传入,这时此方法会将浏览器中url传递进来的参数进行类型转换,再传入view.py中对应的视图函数里
        return int(value)

    def to_url(self, value):
        # 这个用于url重定向时,reserve在使用kwargs传递参数时,会将参数的类型进行转化传递到浏览器的url中
        return str(value)

完成类型转换后还需要进行注册,django中converters.py注册代码如下

DEFAULT_CONVERTERS = {
    'int': IntConverter(),
    'path': PathConverter(),
    'slug': SlugConverter(),
    'str': StringConverter(),
    'uuid': UUIDConverter(),
}
# 默认已经注册的解释器类

REGISTERED_CONVERTERS = {}


def register_converter(converter, type_name):
    REGISTERED_CONVERTERS[type_name] = converter()
    get_converters.cache_clear()

# converter解释器的类名,调用时的别名

 

开始定义自定义的path解释器,实现如下功能

 

在应用目录新建converters.py,在应用的目录下的__init__.py文件中写入from . import converters,进行初始化,converters.py代码如下

from django.urls import converters,register_converter

class CategoryConverter(object):
    '''自定义的path解释器'''

    regex = r'\w+|(\w+\+\w+)+'

    def to_python(self, value):
        result = value.split("+")
        return result

    def to_url(self, value):
        if isinstance(value, list):
            result = "+".join(value)
            return result
        else:
            raise RuntimeError("转换url的时候,分类参数必须为列表")


register_converter(CategoryConverter, 'cate')

 

views.py部分代码

 1 from django.shortcuts import render,HttpResponse,redirect,reverse
 2 
 3 def article(request):
 4     return HttpResponse('文章首页')
 5 
 6 def article_list(request, categories):
 7     text = '你填写的分类是:%s' % categories
 8     return HttpResponse(text)
 9 
10 def artcile_detail(request, article_id):
11     reverse('detail', kwargs={'article_id':article_id})
12     return HttpResponse('文章详情')

 

urls.py部分代码

 1 from django.urls import path,include,re_path
 2 from booktest import views
 3 from django.urls import converters
 4 # ctrl+b 打开converters.py
 5 
 6 urlpatterns = [
 7     path('^article/$', views.article),
 8     path('article/list/<cate:categories>/', views.article_list),
 9     path('article/detail/<int:article_id>', views.artcile_detail),
10 ]

 

浏览器返回页面:

posted @ 2020-03-08 14:06  kog_maw  阅读(188)  评论(0编辑  收藏  举报