4.自定义url转换器

 

自定义URL(path)转换器笔记:

需求1

实现一个读取文章列表的demo,用户能够根据/articles/文章分类/
的方式来获取文章.其中文章分类采用的是分类1+分类2+分类3...
的方式拼接的,而且若是只有一个分类,那就不须要加号,示例以下:javascript

# 第一种: 获取python分类下的文章
/articles/python/
# 第二种: 获取python和Django分类下的文章
/articles/python+django/
# 第三种: 获取python和Django和flask分类下的文章
/articles/python+django+flask/
以此类推...

需求2

1.在’文章分类’参数传到视图函数以前要把这些分类分开来存储到列表中.好比参数是
python+django,那么传到视图函数的时候就要变成['python','django']
2.之后在使用reverse反转的时候,文章分类的参数不该该是列表了,由于url路径没有用列表
,全部要将视图函数的['python','django']在转变成python+django的形式html

自定义url转换器

以前已经学到过一些django内置的url转换器,包括有int、uuid等。有时候这些内置的url转换器并不能知足咱们的需求,所以django给咱们提供了一个接口可让咱们本身定义本身的url转换器。java

自定义url转换器按照如下五个步骤来走就能够了:python

1.定义一个类,直接继承object就能够了。
2. 在类中定义一个属性regex,这个属性是用来限制url转换器规则的正则表达式。
3. 实现to_python(self,value)
方法,这个方法是将url中的值转换一下,而后传给视图函数的。
4.实现to_url(self,value)方法,这个方法是在作url反转的时候,将传进来的参数转换后拼接成一个正确的url。
5.将定义好的转换器,使用django.urls.converter.register_conterver方法注册到django中。ios

示例代码以下:web

from django.urls import register_converter

class CategoryConverter(object):
    regex = '\w+|(\w+\+\w+)+'
    def to_python(self,value):
        # 在url中是 python+django+flask
        # 转换到视图中须要是["python","django","flask"]
        result = value.split("+")
        return result
    def to_url(self,value):
        # 目前是["python","django","flask"]
        # 反转url的时候须要是python+django+flask
        if isinstance(value,list):
            result = "+".join(value)
            return result
        else:
            raise RuntimeError("转换成url的时候,分类参数必须是列表!!!")
register_converter(CategoryConverter,"cate")

URL映射的时候制定默认参数:

使用path或者是re_path后,在route中均可以包含参数,而有时候想指定默认的参数,这时候能够经过如下方式来完成。示例代码以下:正则表达式

from django.urls import path

from . import views

urlpatterns = [
    path('blog/', views.page),
    path('blog/page<int:num>/', views.page),
]

# View (in blog/views.py)
def page(request, num=1):
    # Output the appropriate page of blog entries, according to num.
    ...


当在访问blog/的时候,由于没有传递num参数,因此会匹配到第一个url,这时候就执行view.page这个视图函数,而在page函数中,又有num=1这个默认参数。所以这时候就能够不用传递参数。而若是访问blog/1的时候,由于在传递参数的时候传递了num,所以会匹配到第二个url,这时候也会执行views.page,而后把传递进来的参数传给page函数中的numdjango

相关文章
相关标签/搜索