Django入门(八):自定义标签和过滤器

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. 再看一下结果,实际上是执行了<>内部的程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DOT Manager

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值