1. 利用装饰器 @register.filter 自定义过滤器。
1、在应用目录下创建 templatetags 文件夹,(注意是文件夹),目录(注意:与 templates 目录同级,目录名只能是 templatetags),如下图,位置不要错:
HelloWorld/
|-- HelloWorld
| |-- __init__.py
| |-- __init__.pyc
| |-- settings.py
...
|-- manage.py
`-- templatetags
`-- templates
2、在 templatetags 目录下创建任意 py 文件,如:my_tags.py,此文件名可以任意,最终如下图所示:
3、然后在my_tags.py 文件中输入 代码如下:
为了导入注册过滤器的Library 实例
from django import template
register = template.Library() #register的名字是固定的,不可改变
4.修改 settings.py 文件的 TEMPLATES 选项配置,添加 libraries 配置:
...
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR, "/templates",],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
"libraries":{ # 添加这边三行配置
'my_tags':'templatetags.my_tags' # 添加这边三行配置
} # 添加这边三行配置
},
},
]
...
5、在my_tags.py文件中定义自定义过滤器,利用装饰器 @register.filter 自定义过滤器。
注意:装饰器的参数最多只能有 2 个,至少是一个
过滤器格式如下:
# 一个参数的过滤器
@register.filter
def singer_filter(self):
return self
# 两个参数的过滤器
@register.filter
def double_filter(self, value):
return self *value
示例如下:第一个就是含有一个参数的过滤器,参数就是“zhangsan”;第二个有两个参数,一个是”zhangsan“,一个是2
<p>
{{ 'zhangsan'|singer_filter }}
{{ 'zhangsan'|double_filter:2 }}
</p>
总结:过滤器| 前面的值就是传递给过滤器的第一个参数,冒号后面的传递给过滤器的第二个参数
代码举例:
1. 在views.py中输入如下代码:
from django.shortcuts import render
def mydef(request):
views_list = 528
return render(request, "mytemp.html", {"num": views_list})
2. 在my_tags.py中输入如下代码:
我们自定义了一个乘法,其中a是过滤器“管道”前的参数值,b是冒号:后面传入的值
from django import template
register=template.Library()
@register.filter
def sub(a,b):
return a*b
3. 在mytemp.html文件中输入:
注意:在使用自定义标签和过滤器前,要在 html 文件 body 的最上方中导入该 py 文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{%load my_tags%} #意思是导入my_tags.py 文件
<h1>if/else演示</h1>
<ul>
{{num|sub:3}}
</ul>
</body>
</html>
4.最终显示结果为:1584. 大家明白了吗?
2. 利用装饰器 @register.simple_tag 自定义标签
自定义标签的写法都是固定的,都有一套格式: {% 自定义标签 参数1 参数2 参数n %}
它和过滤器最大的区别就是可以接收多个参数,自定义标签可以接收多个参数,过滤器只能接收两个参数,但是在if和for中( 内置标签和自定义标签中 ),自定义标签无法使用
代码举例:
前面的几步如第一节所讲的,这里直接再写下去
1. 在views.py中输入如下代码:
from django.shortcuts import render
def mydef(request):
views_list = 528
return render(request, "mytemp.html", {"num": views_list})
2. 在my_tags.py中输入如下代码:
我们自定义了一个乘法,其中a是过滤器“管道”前的参数值,b是冒号:后面传入的值
from django import template
register=template.Library()
@register.filter
def sub(a,b):
return a*b
@register.simple_tag
def add(a,b,c):
return a+b+c
3. 在mytemp.html文件中输入:
注意:在使用自定义标签和过滤器前,要在 html 文件 body 的最上方中导入该 py 文件。即增加这一句{%load my_tags%}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{%load my_tags%}
<h1>if/else演示</h1>
<ul>
{{num|sub:3}}
{%add 11 12 13%}
</ul>
</body>
</html>
4.最终显示结果为:36. 大家明白了吗?
3. 语义化标签
1. 在my_tags.py中导入 mark_safe。
2. 定义标签时,用上 mark_safe 方法,令标签语义化,相当于 jQuery 中的 html() 方法。和前端HTML文件中的过滤器 safe 效果一样。
代码如下:注意:我们首先没有用mark_safe,看下结果,然后对比看一下用mark_safe的结果,帮助我们理解
from django import template
from django.utils.safestring import mark_safe
register=template.Library()
@register.filter
def sub(a,b):
return a*b
@register.simple_tag
def add(a,b,c):
return a+b+c
@register.simple_tag
def my_html(v1, v2):
temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
return temp_html
3. 在mytemp.html文件中输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{%load my_tags%}
<h1>if/else演示</h1>
<ul>
{{num|sub:3}}
{%add 11 12 13%}
{% my_html "zzz" "xxx" %}
</ul>
</body>
</html>
4. 最终显示结果为:一串字符串
5. 我们重新修改一下 my_tags.py,增加了return mark_safe
from django import template
from django.utils.safestring import mark_safe
register=template.Library()
@register.filter
def sub(a,b):
return a*b
@register.simple_tag
def add(a,b,c):
return a+b+c
@register.simple_tag
def my_html(v1, v2):
temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
return mark_safe(temp_html)
6. 再看一下结果,实际上是执行了<>内部的程序