五.自定义过滤器及标签 2021-03-02

 五.自定义过滤器及标签

1.为什么要自定义Django中的自定义过滤器:

Django中提供了很多内置的过滤器和标签,详见Django官网链接 Custom template tags and filters | Django documentation | Django (djangoproject.com),主要有以下几个:

autoescape(自动转义)
block(模板继承)
csrf_token(跨站伪造请求)
extends(模板继承)
filter(过滤器)
for(循环)
if(判断)
include(加载模板)
等等,还有很多详见官网上的内容。
虽然在Django中内置了很多的过滤器和标签,但是并不是所有的标签符合我们的项目开发,所以我们需要自定义模板和标签来满足我们的需求

2.文件路径的配置

之前我们说过了templates文件夹是用来存放模板的,现在我们需要建立新的文件夹templatetags用来存放自定义的标签及过滤器的目录

templatetags文件夹(文件夹名字不可改,否则会django会无法识别),templatetags可以存放多个文件,每个文件可以存放多个功能相关的过滤器,使用功能相关的过滤器时,直接导入单个文件就可以一并使用相关功能。

2.1 templatetags 的路径配置

目录结构一般如下:
1.在项目目录下 创建个名为 ***** 的Python包

2.将 ***** 加入到项目目录的settings文件中的INSTALLED_APP列表中

3.在 ***** 里面创建目录templatetags,在目录里面创建自定义过滤器及标签文件.

注意:templatetags这个目录名字是固定的,而里面的模块名是自定义的.

例:

 

 

 

 

 

 

 

 

 

2.2 自定义过滤器

自定义过滤器就是一个带有一个或两个参数的Python 函数:

- (输入的)变量的值 —— 不一定是字符串形式。

- 参数的值 —— 可以有一个初始值,或者完全不要这个参数。

过滤器结构:{{变量|过滤器:参数}}

例:自定义过滤器(在common_extras.py文件中自定义cut和lower的过滤器功能)

  • value为固定的参数,用来调用方法
  • mycut自定义过滤器 ---- 用来取出空格,与自带的cut类类似{{fruits|cut:" "}}
  • mylower --- 将所有的大写转为小写

2.3注册自定义的过滤器

使用django.template.Library.filter()方法                    filter的用法可以在Django的官网查看

1. django.template.Library.filter()

1.Library.filter()方法需要两个参数:

  a. 过滤器的名称(一个字符串对象)

  b. 编译的函数 – 一个Python函数(不要把函数名写成字符串)

2.可以把register.filter()用作装饰器;

3.没有声明 name 参数,Django将使用函数名作为过滤器的名字

2.django.template.Library.filter()的使用流程

1.导入模板库

from django import template 

2.对Library类进行实例

实例名 = template.Library()

3.调用的filter()函数

实例名.filter(neme,fuc)

4.注册自定义过滤器

@实例名.filter

例:

2.4 使用自定义过滤器

在模板中使用自定义的过滤器

需要使用{% load %}标签将我们的自定义模块加载进来

{% load %} 声明将会载入给定模块名中的标签/过滤器

2.5 代码实现

调用的流程

1.自定义与注册过滤器

#1.导入模板库
from django import template
#2.对Library类进行实例
register = template.Library()

def mycut(value,arg):
    return value.replace(arg,'')

#3.调用的filter()函数
register.filter('mycut',mycut)
#4.注册自定义过滤器
@register.filter

def mylower(value):
    return value.lower()

2.建立模板用{%load%} 导入自定义的过滤器文件

{% load common_extras %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义过滤器及标签</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    {{ts|mylower}}<br>
    {{ts|mycut:''}}<br>
</body>
</html>

3.设置显示函数

def lode(request):
    return render(request,'load.html',context= {
        'ts':'ssssss    TTTTT    STst'})

4.设置子应用的显示函数路由

from django.urls import path,re_path
from  .import views

urlpatterns = [
    
    path('load/',views.lode)
]

5.运行结果

3.自定义标签

简单标签django.template.Library.simple_tag()

包含标签django.template.Library.inclusion_tag()

tag()方法有两个参数:

1. 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。

2. 编译的函数 – 一个Python函数(不要把函数名写成字符串)

与过滤器注册一样,也可以将其用作装饰器。

3.1简单标签:

1.django.template.Library.simple_tag()

simple_tag(self, func=None, takes_context=None, name=None):   

  • 参数1:函数
  • 参数2:注册标签时使用takes_context 参数,则可以使用从上下文中传入的参数.
  • 参数3:标签名

2.django.template.Library.filter()的使用流程

1.导入模板库

from django import template 

2.对Library类进行实例

实例名 = template.Library()

4.注册自定义过滤器

@实例名.simple_tag

例:

1.定义一个显示当前时间的简单标签,需传入时间格式

2.注册标签时使用takes_context 参数,则可以使用从上下文中传入的参数.

3.模板中使用自定义的标签.

3.2代码实现

1.自定义与注册过简单标签

#1.导入模板库
from django import template
import datetime
#2.对Library类进行实例
register = template.Library()

def mycut(value,arg):
    return value.replace(arg,'')

#3.调用的filter()函数
register.filter('mycut',mycut)
#4.注册自定义过滤器
@register.filter

def mylower(value):
    return value.lower()


@register.simple_tag
def current_time1(format_string):
    return datetime.datetime.now().strftime(format_string)


@register.simple_tag(takes_context = True )

def current_time2(context):
    #format_string_01 = context.get('format_string')
    return datetime.datetime.now().strftime("format_string_01")

2.建立模板用{%load%} 导入自定义的过滤器 标签文件

{% load common_extras %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义过滤器及标签</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    {{ts|mylower}}<br>
    {{ts|mycut:''}}<br>
    {% current_time1 '%Y年%m月%d日  %H:%M:%S'%}<br>
    {% current_time2 %}<br>
</body>
</html>

3.设置显示函数

def lode(requst):
    return render(requst,'load.html',context= {
        'ts':'ssssss    TTTTT    STst'})

4.设置子应用的显示函数路由

from django.urls import path,re_path
from  .import views

urlpatterns = [
    
    path('load/',views.lode)
]

5.运行结果

3.2包含标签

1.包含标签django.template.Library.inclusion_tag()

例如很多地方都可能会用到下面这几行代码,除了choices这个变量不一样之外,其他的都是格式都一样时,那么我们就可以把这部分代码封装在一个包含标签中.


<ul>
    {% for i in choices %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>

2.自定义包含标签例子

1.定义一个名为show_tag.html文件来存放功能代码.

 

2.定义包含标签.

 

3.3代码实现

1.定义一个名为show_tag.html文件来存放功能代码.

{% load common_extras %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    <ul>
        99999<br>
        {% for i in li %}
            <li>{{ i }}</li><br>
        {% endfor %}
        8888<br>               
    </ul>

</body>
</html>

2.建立自定义标签

#1.导入模板库
from django import template
import datetime
#2.对Library类进行实例
register = template.Library()

def mycut(value,arg):
    return value.replace(arg,'')

#3.调用的filter()函数
register.filter('mycut',mycut)
#4.注册自定义过滤器
@register.filter

def mylower(value):
    return value.lower()


@register.simple_tag
def current_time1(format_string):
    return datetime.datetime.now().strftime(format_string)


@register.simple_tag(takes_context = True )

def current_time2(context):
    #format_string_01 = context.get('format_string')
    return datetime.datetime.now().strftime("format_string_01")

@register.inclusion_tag('show_tag.html')
def show_results():
    li = ['xxx','cccc']
    data = "66666"
    return {'li':li,
            'data':data}

3.建立模板用{%load%} 导入自定义的过滤器 标签文件

{% load common_extras %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义过滤器及标签</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    {{ts|mylower}}<br>
    {{ts|mycut:''}}<br>
    {% current_time1 '%Y年%m月%d日  %H:%M:%S'%}<br>
    {% current_time2 %}<br>
    {% show_results %}
</body>
</html>

4.建立显示函数

from django.shortcuts import render

from django.http import HttpResponse
# Create your views here.


def common(request):
    return render(request,'load.html',context= {
        'ts':'ssssss    TTTTT    STst'})

5.建立子路由

from django.urls import path,re_path
from  .import views

urlpatterns = [
    path('common/',views.common),
]

6

6.运行结果

7.文件调用顺序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值