五.自定义过滤器及标签
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.文件调用顺序