django2中自定义过滤器

239 阅读2分钟

一、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')