1. 程式人生 > >2018.12.22日,什麼是過濾器?過濾器幹嘛的?

2018.12.22日,什麼是過濾器?過濾器幹嘛的?

過濾器

DJANGO在編寫後臺的過程裡面,有時候會對傳送到前端的資料進行一個過濾,變成客戶需要的樣式。這時候,就需要編寫過濾去取進行規範。

例子

在這裡插入圖片描述
這裡的時間顯示是JULY 6,2018, 11:56 A.M是不符合客戶要求的,客戶要求把這裡顯示成1小時前

修改後

在這裡插入圖片描述

這就是過濾器的作用,下面例項

自定義模版過濾器
雖然DTL給我們內建了許多好用的過濾器。但是有些時候還是不能滿足我們的需求。因此Django給我們提供了一個介面,可以讓我們自定義過濾器,實現自己的需求。

模版過濾器必須要放在app中,並且這個app必須要在INSTALLED_APPS中進行安裝。然後再在這個app下面建立一個Python包叫做templatetags。再在這個包下面建立一個python檔案。比如app的名字叫做book,那麼專案結構如下:

在建立了儲存過濾器的檔案後,接下來就是在這個檔案中寫過濾器了。過濾器實際上就是python中的一個函式,只不過是把這個函式註冊到模板庫中,以後在模板中就可以使用這個函數了。但是這個函式的引數有限制,第一個引數必須是這個過濾器需要處理的值,第二個引數可有可無,如果有,那麼就意味著在模板中可以傳遞引數。並且過濾器的函式最多隻能有兩個引數。在寫完過濾器後,再使用django.template.Library物件註冊進去。示例程式碼如下:

from django import template

建立模板庫物件

register = template.Library()

過濾器函式

def mycut(value,mystr):
return value.replace(mystr)

將函式註冊到模板庫中

register.filter(“mycut”,mycut)
以後想要在模板中使用這個過濾器,就要在模板中load一下這個過濾器所在的模組的名字(也就是這個python檔案的名字)。示例程式碼如下:

{% load my_filter %}
自定義時間計算過濾器:
有時候經常會在朋友圈、微博中可以看到一條資訊發表的時間,並不是具體的時間,而是距離現在多久。比如剛剛,1分鐘前等。這個功能DTL是沒有內建這樣的過濾器的,因此我們可以自定義一個這樣的過濾器。示例程式碼如下:

# time_filter.py檔案

from datetime import datetime
from django import template

register = template.Library()

def time_since(value):
    """
    time距離現在的時間間隔
    1. 如果時間間隔小於1分鐘以內,那麼就顯示“剛剛”
    2. 如果是大於1分鐘小於1小時,那麼就顯示“xx分鐘前”
    3. 如果是大於1小時小於24小時,那麼就顯示“xx小時前”
    4. 如果是大於24小時小於30天以內,那麼就顯示“xx天前”
    5. 否則就是顯示具體的時間 2017/10/20 16:15
    """
    if isinstance(value,datetime):
        now = datetime.now()
        timestamp = (now - value).total_seconds()
        if timestamp < 60:
            return "剛剛"
        elif timestamp >= 60 and timestamp < 60*60:
            minutes = int(timestamp / 60)
            return "%s分鐘前" % minutes
        elif timestamp >= 60*60 and timestamp < 60*60*24:
            hours = int(timestamp / (60*60))
            return "%s小時前" % hours
        elif timestamp >= 60*60*24 and timestamp < 60*60*24*30:
            days = int(timestamp / (60*60*24))
            return "%s天前" % days
        else:
            return value.strftime("%Y/%m/%d %H:%M")
    else:
        return value


register.filter("time_since",time_since)

在模版中使用的示例程式碼如下:

{% load time_filter %}
...
{% value|time_since %}
...

為了更加方便的將函式註冊到模版庫中當作過濾器。也可以使用裝飾器來將一個函式包裝成過濾器。示例程式碼如下:

from django import template
register = template.Library()

@register.filter(name='mycut')
def mycut(value,mystr):
    return value.replace(mystr,"")