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

相關文章
相關標籤/搜索