自定義URL(PATH)轉換器筆記:
需求:
實現一個獲取文章列表的demo,用戶可以根據/articles/文章分類/的方式來獲取文章。其中文章分類采用的是分類1+分類2+分類3...的方式拼接的,並且如果只有一個分類,那就不需要加號。示例如下:
# 1. 第一種:獲取python分類下的文章
/articles/python/
# 2. 第二種:獲取python和django分類下的文章
/articles/python+django/
# 3. 第三種:獲取python和django和flask分類下的文章
/articles/python+django+flask/
以此類推...
在“文章分類”參數傳到視圖函數之前要把這些分類分開來存儲到列表中。
比如參數是python+django,那么傳到視圖函數的時候就要變成['python','django']。
以后在使用reverse反轉的時候,限制傳遞“文章分類”的參數應該是一個列表,並且要將這個列表變成python+django的形式。
自定義URL轉換器:
之前已經學到過一些django內置的url轉換器,包括有int、uuid等。有時候這些內置的url轉換器並不能滿足我們的需求,因此django給我們提供了一個接口可以讓我們自己定義自己的url轉換器。
自定義url轉換器按照以下五個步驟來走就可以了:
- 定義一個類,直接繼承自object就可以了。
- 在類中定義一個屬性regex,這個屬性是用來限制url轉換器規則的正則表達式。
- 實現to_python(self,value)方法,這個方法是將url中的值轉換一下,然后傳給視圖函數的。
- 實現to_url(self,value)方法,這個方法是在做url反轉的時候,將傳進來的參數轉換后拼接成一個正確的url。 5. 將定義好的轉換器,使用
django.urls.converters.register_converter方法注冊到django中。
示例代碼如下:
from django.urls import 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')
