自定義URL(PATH)轉換器筆記

自定義URL(PATH)轉換器筆記:

需求:

實現一個獲取文章列表的demo,用戶能夠根據/articles/文章分類/的方式來獲取文章。其中文章分類採用的是分類1+分類2+分類3...的方式拼接的,而且若是隻有一個分類,那就不須要加號。示例以下:python

# 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的形式。django

自定義URL轉換器:

以前已經學到過一些django內置的url轉換器,包括有int、uuid等。有時候這些內置的url轉換器並不能知足咱們的需求,所以django給咱們提供了一個接口能夠讓咱們本身定義本身的url轉換器。flask

自定義url轉換器按照如下五個步驟來走就能夠了:函數

  1. 定義一個類,直接繼承自object就能夠了。
  2. 在類中定義一個屬性regex,這個屬性是用來限制url轉換器規則的正則表達式。
  3. 實現to_python(self,value)方法,這個方法是將url中的值轉換一下,而後傳給視圖函數的。
  4. 實現to_url(self,value)方法,這個方法是在作url反轉的時候,將傳進來的參數轉換後拼接成一個正確的url。 5. 將定義好的轉換器,使用django.urls.converters.register_converter方法註冊到django中。

示例代碼以下:ui

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')
相關文章
相關標籤/搜索