django2中自定義過濾器

水痕001發表於2019-03-04

一、django中自帶的過濾器參考

二、django中自定義過濾器

  • 1、在app下建立一個包templatetags(名字必須是這個)

  • 2、這個app必須在settings.py中註冊

  • 3、在templatetags中建立一個xx.py檔案

  • 4、下面定義了2個過濾器

    from django import template
    import datetime
    
    register = template.Library()
    
    
    @register.filter
    def chinese_date_format(value):
        """
        一個將時間轉換為中國時間的過濾器
        :param value:
        :return:
        """
        if isinstance(value, datetime.datetime):
            return "{}年{}月{}日".format(value.year, value.month, value.day)
        else:
            return value
    
    
    @register.filter
    def add_description(value, tag):
        """
        一個給標籤新增tag的過濾器
        :param value:
        :param tag:
        :return:
        """
        return f'{value}({tag})'
    複製程式碼
  • 5、在需要使用自定義的過濾器的模板中(在django中指的是html頁面)

    {% load [你自定義的過濾器的py檔名] %}
    複製程式碼
  • 6、使用

    ...
    <td>{{ book.name | add_description:"一本書" }}</td>
    <td>{{ book.date | chinese_date_format }}</td>
    ...
    複製程式碼

三、附加一個常用的過濾器

定義一個多少時間之前的過濾器,使用方式和上面一樣的

@register.filter('time_ago')
def time_ago(value):
    """
    定義一個距離當前時間多久之前的過濾器
    :param value:
    :return:
    1.如果時間間隔小於1分鐘內,那麼就顯示剛剛
    2.如果時間間隔大於1分鐘小於1小時,那麼就顯示xx分鐘前
    3.如果時間間隔大於1小時小於24小時,那麼就顯示xx小時前
    4.如果時間間隔大於24小時小於30天,那麼就顯示xx天前
    5.如果時間間隔大於30天,那麼就顯示具體時間
    """
    if not isinstance(value, datetime.datetime):
        return value
    now = datetime.datetime.now()
    timestamp = (now - value).total_seconds()
    if timestamp < 60:
        return '剛剛'
    elif timestamp >= 60 and timestamp < 60 * 60:
        return '{}分鐘前'.format(int(timestamp / 60))
    elif timestamp >= 60 * 60 and timestamp < 60 * 60 * 24:
        return '{}小時前'.format(timestamp / 60 / 60)
    elif timestamp >= 60 * 60 * 24 and timestamp < 60 * 60 * 23 * 30:
        return '{}天前'.format(int(timestamp / 60 / 60 / 24))
    else:
        return value.strftime('%Y-%m-%d %H:%M')
複製程式碼

相關文章