自定义过滤器和自定义标签

自定义标签和过滤器 需要执行的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等语句后,标签不可以

原文地址:https://www.cnblogs.com/kenD/p/10067700.html