(1)引入:为何要自定义过滤器及标签?
(2)固有的模板过滤器的分析:
1.自定义过滤器:(1) 第一步:
创建项目,创建应用,注册应用,配置settings.py文件,配置urls映射,编写views试图,编写模板templates
(2)第二步:
实际上,在项目目录或者应用目录下创建都是可以的,创建一个名为templatetags的python模块
{注意:
(1)必须使用“templatetags”这个名称,否则无效。
(2)这个文件夹要添加在app的目录下,并且需要包含“init.py”文件。也就是说,这个文件夹是个Python Package,而不是普通的文件夹。
(3)在项目设置文件“settings.py”中进行app注册。}
(3)第三步:
在我这里,我在项目目录下创建个名为common的app,templatetags 是存放过滤器的模块,模块和目录的区别是模块里面必须有__init__.py(“init.py”就是一个空文件,可以自己创建,只要名称正确就可以。如果没有的话,在模板中加载我们的自定义过滤器时会加载不了!!!),告诉python这是可以import的东西(所以在common包下要创建一个__init__.py文件;在templatetags模块下也要创建一个__init__.py文件!)
(4)第四步:
在templatetags模块里,建立一个py文件,写我们的自定义的过滤器,文件名称可以自己定,这里我用common_extras.py
(5)第五步:
过滤器的编写:common_extras.py文件的编写!
#用于编写自定义过滤器及标签
from django import template
register = template.Library()
@register.filter #@register.filter(name="aa")过滤器里面有很多选项
def mylower(value):
return value.lower()
@register.filter
def mycut(value,arg):
return value.replace(arg,"")
'''
django.template.Library.filter()
1.Library.filter()方法需要两个参数:
a. 过滤器的名称(一个字符串对象)
b. 编译的函数 – 一个Python函数(不要把函数名写成字符串)
2.可以把register.filter()用作装饰器;
3.没有声明 name 参数,Django将使用函数名作为过滤器的名字。
下面是不常用的方法:
def mycut(value,arg):
return value.replace(arg,"")
register.filter("mycut",mycut)
'''
过滤器必须用Library().filter 来进行装饰, name表示过滤器的名字,也可以不指定,函数名就是过滤的名字
装饰后的函数,才能当作过滤器来使用
(6)第六步:
模板文件引入自定义过滤器的使用:
{# 在模板中使用自定义的过滤器需要使用模板标签将我们的自定义模块加载进来,#}
{#此声明将会载入给定模块名中的标签/过滤器。common_extras是我过滤器所在py文件的名字 #}
{% load common_extras %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>lala</title>
</head>
<body>
{#过滤器的作用:在不改变别人代码的同时添加新的功能!#}
{#变小写:#}
<h1>通过内置过滤器:{{ name|lower }}</h1>
{#定义不携带参数的过滤器:#}
<h1>自定义过滤器:{{ name|mylower }}</h1>
{#切割对应参数:#}
{#定义携带参数的过滤器:#}
<h1>通过内置过滤器:{{ aa|cut:" " }}</h1>
<h1>自定义过滤器:{{ aa|mycut:" " }}</h1>
</body>
</html>
在模板中必须用{%load name%} 来引入我们的过滤器函数所在的py文件,name是py文件的名字 这里我的事common_extras。
之后 如果使用过滤器那么就直接 变量|过滤器 就可以了。
实现:
2.自定义标签:第一种:自定义普通标签!
(1)自定义标签的编写:common_extras.py文件的编写!
from datetime import datetime
#显示当前时间
#第一种:在模板中使用自定义标签时传递参数
@register.simple_tag
def current_time1(format_string):
return datetime.now().strftime(format_string)
#第二种:注册标签时使用takes_context=True,则可以使用从上下文中传入的参数
@register.simple_tag(takes_context=True)
def current_time2(context): #此处context即为上下文中传入的参数
format_string=context.get("format_string")
return datetime.now().strftime(format_string)
(2)对应的视图函数:views.py文件的编写!(第二种使用从上下文中传入的参数)
def login(request):
#下面为从上下文中传入的参数!
return render(request,"ss.html",context={"format_string":"%Y年%m月%d日 %H:%M:%S"})
(3)模板中引入自定义标签及使用:
{# 必须用这一句去引用 common_extras是自定义标签所在py文件的名字 #}
{% load common_extras %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>lala</title>
</head>
<body>
<h1>原样:{{ d }}</h1>
<h1>通过内置过滤器:{{ d|date:"Y/m/d H:i:s" }}</h1>
<h1>第一种:通过自定义标签:{% current_time1 "%Y年%m月%d日 %H:%M:%S" %}</h1>
<h1>第二种:通过自定义标签:{% current_time2 %}</h1>
</body>
</html>
第二种:自定义包含标签!
**包含标签的功能是可以通过渲染另外一个模板来显示一些数据
**
例如很多地方都可能会用到下面这几行代码,除了choices这个变量不一样之外,其他的都是格式都一样时,那么我们就可以把这部分代码封装在一个包含标签中.
<ul>
{% for i in choices %}
<li>{{ i }}</li>
{% endfor %}
</ul>
实现: