美文网首页
Django - 自定义模板过滤器

Django - 自定义模板过滤器

作者: 前端程序猿 | 来源:发表于2018-12-10 01:50 被阅读0次

接着 内置模板过滤器 往下讲

一、模板过滤器的定义

  • 在应用的目录下,如 front 下, 新建一个名为: templatetagspython

  • 新建 front/templatetags/custom_filter.py, 并定义两个模板过滤器如下:

    from django import template
    
    register = template.Library()
    
    
    def my_add(value, arg):
        try:
            return value + arg
        except (Exception,):
            return ''
    
    
    def my_upper(value):
        try:
            return value.upper()
        except (Exception,):
            return value
    
    
    register.filter('my_add', my_add)
    register.filter('my_upper', my_upper)
    
  • 需要使用 {% load custom_filter %}, 把应用下定义模板过滤器的文件导入模板

  • templates/index.html 代码修改如下:

    {% load custom_filter %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {#abcdef#}
    {{ "abc"|my_add:"def" }} <br>
    {#HELLO#}
    {{ "hello"|my_upper }}
    </body>
    </html>
    
  • *注意,front 应用必须在 mysite/settings.py 进行注册,在 front 下定义的模板过滤器才能起作用

    INSTALLED_APPS = [
        'front',
    ]
    

二、实战--自定义时间计算过滤器

front/templatetags/custom_filter.py

from django import template
from datetime import datetime

register = template.Library()


@register.filter
def time_since(value):
    """
    time距离现在的时间间隔
    1 如果时间间隔小于1分钟,那么显示 刚刚
    2 如果时间间隔大于1分钟小于1小时, 那么显示 xx 分钟前
    3 如果是大于1小时小于24小时,那么显示 xx 小时前
    4 如果大于24小时,小于30天, 那么显示 xx 天前
    5 否则显示具体时间, 2018/12/10 23:05
    """
    if not isinstance(value, datetime):
        return value
    now = datetime.now()
    timestamp = (now - value).total_seconds()
    if timestamp < 60:
        return '刚刚'
    elif 60 <= timestamp < 60 * 60:
        minutes = int(timestamp/60)
        return '%s分钟前' % minutes
    elif 60 * 60 <= timestamp < 60 * 60 * 24:
        hour = int(timestamp / (60 * 60))
        return '%s 小时前' % hour
    elif 60 * 60 * 24 <= timestamp < 60 * 60 * 24 * 30:
        days = int(timestamp / (60 * 60 * 24))
        return '%s 天前' % days
    else:
        return value.strftime("%Y/%m/%d %H:%M")

front/views.py

from django.shortcuts import render
from datetime import datetime


def index(request):
    context = {
        'my_time_1': datetime.now(),
        'my_time_2': datetime(year=2018, month=12, day=10, hour=23, minute=18),
        'my_time_3': datetime(year=2018, month=12, day=10, hour=18, minute=18),
        'my_time_4': datetime(year=2018, month=12, day=1, hour=22, minute=18),
        'my_time_5': datetime(year=2017, month=12, day=10, hour=23, minute=18),
    }
    return render(request, 'index.html', context=context)

templates/index.html

{% load custom_filter %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#刚刚 #}
{{ my_time_1|time_since }} <br>
{#7分钟前 #}
{{ my_time_2|time_since }} <br>
{#5 小时前 #}
{{ my_time_3|time_since }} <br>
{#9 天前 #}
{{ my_time_4|time_since }} <br>
{#2017/12/10 23:18#}
{{ my_time_5|time_since }}
</body>
</html>

相关文章

  • 3.4 django 自定义模板过滤器

    自定义模板过滤器 虽然DTL给我们内置了许多好用的过滤器。但是有些时候还是不能满足我们的需求。因此Django给我...

  • Django_补充小技巧

    1.Templates过滤器 什么是过滤器? 写在模板中,属于Django模板语言 可以修改模板中的变量,...

  • django过滤器

    过滤器写在模板中,属于django模板语言。这样使用: value是变量,filter是过滤器。举例: 返回lis...

  • Django中自定义模板过滤器

    Django中的模板过滤器强大又好用。当然如果你的项目是前后端分离,未用到模板,那也就不存在模板过滤器一说。 模板...

  • Django框架(五):自定义过滤器及标签

    前言 为什么要自定义过滤器和标签:当Django自带的过滤器及标签不能满足我们需求的时候,我们就需要自定义过滤器和...

  • Flask过滤器

    Flask过滤器分为两种,模板过滤器和自定义过滤器 顾名思义,模板过滤器是人家已经定义好的,你直接拿来使用就好了 ...

  • Django - 自定义模板过滤器

    接着 内置模板过滤器 往下讲 一、模板过滤器的定义 在应用的目录下,如 front 下, 新建一个名为: temp...

  • Flask的jinja2模板中自定义过滤器的使用

    Flask的jinja2模板中自定义过滤器的使用 ...

  • Django - 模板结构优化

    接着 自定义模板过滤器 往下讲 一、引入模板 include 标签的使用 新建 templates/header....

  • 2020-06-02--flask04--flask基础04

    jinja2模板 表单验证 WTF表单验证 jinjia2语法 过滤器 jinja2的过滤器与django中的过滤...

网友评论

      本文标题:Django - 自定义模板过滤器

      本文链接:https://www.haomeiwen.com/subject/rbmlhqtx.html