django中使用自定义过滤器和自定义标签

自定义过滤器

首先在app底下新建一个templatetags目录,里面添加两个文件,目录结构如下:
django中使用自定义过滤器和自定义标签_第1张图片

然后在settings.py中把templatetags目录作为app注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp.apps.MyappConfig',
    'myapp.templatetags',  # 作为app注册
]

然后在extratags.py文件中添加自定义的过滤器:

from django import template

register = template.Library()

@register.filter(name='cut')  # 过滤器在模板中使用时的name
def myCut(value, arg):  # 把传递过来的参数arg替换为'~'
    return value.replace(arg, '~')

编辑视图函数,把value传递给模板文件:

def index(request):
    return render(request, 'one.html', {'value':'Hello, dandan!'})

在模板文件中使用的时候,要先导入extra_tags.py文件:

{% load extra_tags %}


<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    head>
    <body>
{#        把value中的“!”替换掉#}
        {{ value | cut:'!' }}
    body>
html>

编辑好urls.py文件,启动服务器,在浏览器访问就可以看到替换后的效果了:
django中使用自定义过滤器和自定义标签_第2张图片

自定义标签

自定义标签和上面的步骤一样,只是定义的形式有所改变(自定义标签,格式化返回当前时间):

# extra_tags.py
# 自定义标签,格式化返回当前时间

@register.tag(name='current_time')
# 解析器
def do_current_time(parse, token):  # parse解析器对象,token被解析的对象,包含标签的名字和格式化的格式
    try:
        tag_name, format_string = token.split_contents()
    except:
        raise template.TemplateSyntaxError('syntax')
    return CurrentNode(format_string[1:-1])  # 传入模板中的节点类

import datetime
class CurrentNode(template.Node):
    def __init__(self, format):
        self.format_string = str(format)

    # 把当前时间格式化后返回
    def render(self, context):
        now = datetime.datetime.now()
        return now.strftime(self.format_string)

在模板中使用:

{% current_time "%Y-%m-%d %H:%M:%S" %}

django中使用自定义过滤器和自定义标签_第3张图片

你可能感兴趣的:(Python:Django学习)