• 第十五节 自定义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 ]

    浏览器返回页面:

  • 相关阅读:
    kafka学习笔记:知识点整理
    java操作hbase 增删改查
    json往前台送数据中文乱码
    17年数据结构笔记
    设置MYSQL数据库编码为UTF-8
    c++的 struct和class
    算法之arrays and strings
    对于快速排序的理解
    sql杂记
    Spring搭建练习遇到的坑
  • 原文地址:https://www.cnblogs.com/kogmaw/p/12442401.html
Copyright © 2020-2023  润新知