自定义标签和过滤器 需要执行的3个步骤:
1. 在app中创建templatetags模块(必须的)
2. 创建任意 .py 文件,如:my_tags.py
3. 创建任意 .py文件, 例如:my_tags.py
自定义过滤器
举例: 增加一个乘法过滤器
修改settings.py中的INSTALLED_APPS, 最后一行添加当前的app
django开头的,都是一些自带的app。它内置在django源码里面
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', ]
在app01目录里面新建一个templatetags目录,目录名必须是这个!!!否则django找不到
目录里面创建my_filter_tag.py, 这个py文件名,可以随便起
from django import template from django.utils.safestring import mark_safe
#因为django遇到html或者js标签,会转义。它认为是不安全的,所以需要在过滤器中导入make_safe模块 register = template.Library() #register的名字是固定的,不可改变 @register.filter #自定义过滤器 def multi_filter(v1,v2): return v1 * v2
注意:头部的3行,是固定写法,不能改变。
增加 @register.filter 是为了将函数转换成过滤器. 函数的名字可以随便起
修改 views.py 里面的index函数, 内容如下
def index(request): num = 100 return render(request,'index.html',{'num':num})
修改index.html 的body部分
注意:在使用自定义标签和过滤器,必须在html文件中,导入之前创建的my_filter_tag
{% load my_filter_tag %}
<p>{{ num|multi_filter:5 }}</p>
load表示导入模块.
p标签中的内容是执行了multi_filter过滤器
注意:接收了2个参数, 一个是num, 一个是5. 因为 multi_filter 传入了2个形参,必须传入2个参数才可以.
django项目启动时,会导入settings.py定义的模块导入,由于app01的自定义模块是启动之后加的,所以要重新启动django项目. 得到的结果是500
自定义过滤器就是一个带有一个或两个参数的Python函数:
注意:这个Python函数的第一个参数是你要过滤的对象,第二个参数才是你自定义的参数。而且最多总共只能有两个参数,所以你只能自定义一个参数!这是过滤器的先天限制。
- 变量的值:不一定是字符串形式。
- 参数的值:可以有一个初始值,或者完全不要这个参数。
例如,在{{ var|foo:"bar" }}
中,foo过滤器应当传入变量var和参数"bar"。
过滤器中的语法: {{ value|filter_name:参数 }} # 参数最多只有一个
如果要完成3位数的乘法,过滤器可以增加一个形参,但是index.html中怎么办呢?
只能在后端,将参数形式修改成列表,元组,字典等形式.
例如计算 4*5*6
修改index视图函数
def index(request): num1 = 4 num2 = 5 num3 = 6 num_list = [num1,num2,num3] return render(request,'index.html',{'num_list':num_list})
修改my_filter_tag.py中的过滤器
@register.filter def multi_filter(num_list): res = 1 for i in num_list: res*=i return res
修改index.html,修改body部分
{% load my_filter_tag %}
<p>{{ num_list|multi_filter }}</p>
举例: 显示a标签
修改my_filter_tag.py文件,增加link_tag过滤器
@register.filter def link_tag(href): return mark_safe("<a href=%s>click</a>" % href
#使用make_safe方法,告诉django是安全的,不需要转义
修改index视图
def index(request): link = "http://www.py3study.com/" return render(request,'index.html',{'link':link})
修改index.html
{% load my_filter_tag %}
<p>{{ link|link_tag }}</p>
自定义标签
标签, 是为了做一些功能
举例: 4个参数的乘法运算
修改my_filter_tag.py, 增加multi_tag函数
@register.simple_tag def multi_tag(x,y,z): return x*y*z
@register.simple_tag表示将函数转换为自定义标签
修改index.html,修改body部分
注意:调用标签,使用{% 标签过滤器名 参数1,参数2,参数3... %}
参数不限,但不能放在if for语句中
{% load my_filter_tag %}
<p>{% multi_tag 4 5 6 %}</p>
重新启动django项目, 查看结果
自定义标签和自定义过滤器的区别:
1. 标签,是为了做一些功能。过滤器,是对斜杠前面的数据做过滤。
2. 标签可以写任意个形参,而过滤器最大只能写2个形参。如果过滤器需要接收多个参数,需要将参数存放在列表,元组,字典等数据中。
3. 过滤器可以用在if等语句后,标签不可以