(六)自定义过滤器及标签

1.自定义的引入

内置函数---------------------->自定义函数
内置模块---------------------->自定义模块
内置过滤器------------------->自定义过滤器
内置标签---------------------->自定义标签

2.目录结构

1.在项目目录下创建一个名为common的python包
2.将common加入到settings文件中的INSTALLED_APP列表中
3.在common里面创建目录templatetags,在目录里面创建自定义过滤器及标签文件。在这里插入图片描述
settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book',
    'movie',
    'common',
]

3.模板过滤器的分析

{{var|foo:“bar”}}
var:变量
foo:过滤器
bar:参数

自定义过滤器就是一个带有一个或两个参数的Python函数:
(输入的)变量的值----不一定是字符串形式。
参数的值----可以有一个初始值,或者完全不要这个参数

4.注册自定义过滤器

django.template.Library.filter()
1.Library.filter()方法需要两个参数:
a.过滤器的名称(一个字符串对象)
b.编译的函数,一个python函数(不要把函数名写成字符串)
2.可以把register.filter()用作装饰器
3.没有声明name函数,Django将使用函数名作为过滤器的名字。

5.自定义过滤器

common_test.py

from django import template
#获取注册的实例对象,名字是固定的
register = template.Library()
#装饰器,在函数的基础上,增加额外的功能
@register.filter
def lowers(value):
    return value.lower()

book_index.html
在html最上方加载common_test

{%load common_test %}
内置过滤器{{ str | lowers }}

定义的函数名为lowers同之前的内置过滤器lower作用一样。

如果将@register.filter改为@register.filter(‘Name’),在调用时,可以用Name来代替命名的函数名。

6.自定义标签

简单标签 django.template.Library.simple_tag()
包含标签django.template.Library.inclusion_tag()
tag()方法有两个参数:
1.模板标记的名称 - 字符串。如果省略,将使用编译函数的名称。
2.编译的函数-一个Python函数(不要把函数名称写成字符串)与过滤器注册一样,也可以将其用作装饰器。

例1:

#自定义简单标签
@register.simple_tag()
def current_time():
    format_string = '%Y/%m/%d %H:%M:%S'
    return datetime.datetime.now().strftime(format_string)
{% current_time %}<br>

例2

#自定义简单标签-传参
@register.simple_tag()
def current_time1(format_string):
    return datetime.datetime.now().strftime(format_string)
{% current_time1 '%Y/%m/%d %H:%M:%S' %}

例3
book/views.py

 def book_index2(request):
    return render(request,'book/book_index.html',context={'name':fru.name,
                                                              'age':fru.age,
                                                              'list':ls,
                                                              'tuple':tu,
                                                              'dict':dc,
                                                              'str':str,
                                                              'fruits':fru,
                                                              'fruits1':fru.say,
                                                              'hello':hello('aaa'),
                                                              'set':se,
                                                              'test':None,
                                                              'num1':11,
                                                              'num2':22,
                                                              'now':datetime.datetime.now,
                                                              'tag':'<h1>我是标题标签</h1>',
                                                              'float':3.1415926,
                                                              'test1':'<:',
                                                              'format_string': '%Y/%m/%d %H:%M:%S'
                                                              })   

common_test.py

#自定义简单标签-上下文
@register.simple_tag(takes_context=True)
def current_time2(context):
    format_string = context.get('format_string')
    return datetime.datetime.now().strftime(format_string)

book_index.html

{% current_time2 %}

三种方法都可以实现

{% current_time %}<br>
{% current_time1 '%Y/%m/%d %H:%M:%S' %}<br>
{% current_time2 %}

在这里插入图片描述

7.自定义包含标签

包含标签的功能是可以通过渲染另外一个模板来显示一些数据,将另一页面的数据显示在指定的模板页面中。
show_tag.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义包含标签</title>
</head>
<body>

{% for foo in counter %}
    {{ foo }}
{% endfor %}

</body>
</html>

例1
common_test.py

#自定义包含标签
@register.inclusion_tag('book/show_tag.html')
def show_result():
    li = ['python','java','c++','web']
    return {'counter':li}

book_index.html

{% show_result %}

例2
common_test.py

#自定义包含标签-传参
@register.inclusion_tag('book/show_tag.html')
def show_reslut1(value):
    return {'counter':value}

book_index.html

2{% show_reslut1 list %}<br>

例3

common_test.py
#自定义包含标签-上下文管理器
@register.inclusion_tag('book/show_tag.html',takes_context=True)
def show_reslut2(context):
    value = context.get('tuple')
    return {'counter':value}

book_index.py

3{% show_reslut2 %}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44204361/article/details/103036631