学习笔记,仅供参考
参考自:Django打造大型企业官网;
本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的写一下。
记得我们以前学习path函数时用的 <int:id>么 ,其中的int就是path转换器,它的底层实现是这样的:
class IntConverter: regex = '[0-9]+' def to_python(self, value): return int(value) def to_url(self, value): return str(value)在这个IntConverter类中它有三个组成部分:
第一部分(regex):正则表达式限制路由规则,在这里,Django规定只能输入数字;
第二部分(to_python):将得到的路径按照一定的规则,转换成统一类型,返回给服务端,在这里,Django将url中得到的str类型参数,转换为int类型参数传递给视图函数;
第三部分(to_url):在进行url反转时,视图函数会将某个形式的数据,转换为特定形式的参数,并将其传递给特定的路由,在这里,Django会将int类型参数转换为str类型的参数,并将str类型的参数传递给特定的路由。
to_python方法相当于做了与to_url方法相反的工作。
现在,我想在url中以书名1+书名2+书名3的方式传递参数,并在视图函数中以列表的形式拿到参数,即[书名1, 书名2, 书名3]
首先,在newwebsite1项目下,我们创建converters.py文件,并该模块中放我们的自定义path转换器类:
from django.urls import converters,register_converter class CategoryConverter(object): regex = r'\w+|(\w+\+\w+)+' def to_python(self,value): # python+django+flask # ['python','django','flask'] result = value.split("+") return result def to_url(self,value): # value:['python','django','flask'] # python+django+flask if isinstance(value,list): result = "+".join(value) return result else: raise RuntimeError("转换url的时候,分类参数必须为列表!") register_converter(CategoryConverter,'cate') #注册 #CategoryConverter为自定义path转换器类 #cate为我们给自定义path转换器起的类名那么我们该如何让这个自定义path转换器生效呢?
我们知道 __init__.py模块用于初始化包,即当我们导入某个包时,python就会执行 __init__.py文件,所以,我们可以将converters.py模块导入到__init__.py模块中:
from . import converters当我们导入converters.py模块时,python就会马上执行converters.py文件中的代码,我们的自定义path转换器就会被注册。
现在,我们在主urls.py中敲入如下代码:
from django.contrib import admin from django.urls import path, converters from . import views from django.conf.urls import include urlpatterns = [ path('admin/', admin.site.urls), path('', views.baidu), path('login/', views.login, name = "signin"), path('book/', include('book.urls')), path('cms1/', include('cms.urls', namespace = "cms1")), path('cms2/', include('cms.urls', namespace = "cms2")), path('front/', include('front.urls')), path('test01/<cate:my_books>/', views.test01), ]views.py中定义视图函数:
def test01(request, my_books): html = "<h2>我有如下书籍:{}</h2>".format(my_books) return HttpResponse(html)我们向服务器发起请求:
Very Well !