zoukankan      html  css  js  c++  java
  • 第十五节 自定义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 ]

    浏览器返回页面:

  • 相关阅读:
    学习 Message(18): WM_SYSCOMMAND 消息[二] : LParam 参数
    学习 Message(20): WM_SYSCOMMAND 消息[四] : 使最大最小化按钮失效
    学习 Message(16): 测试 $0118 号消息
    学习 Message(15): 让窗体同时响应键盘事件的方法
    学习 Message(17): WM_SYSCOMMAND 消息[一]
    请教大家, 关于 $0118 号消息
    学习 Message(21): WM_SYSCOMMAND 消息[五] : 点击关闭按钮让窗体最小化
    学习 Message(22): WM_SYSCOMMAND 消息[六] : 系统菜单综合操作示例
    根据颜色值获取颜色常量名: ColorToIdent
    “博客无双”第二期拍卖活动将于2011年1月26日14:00开始
  • 原文地址:https://www.cnblogs.com/kogmaw/p/12442401.html
Copyright © 2011-2022 走看看