- 自定义过滤器
DTL模板语言生来只是为了方便的展示信息,所以与编程语言相比显得有点薄弱,有时候不能满足我们的需求。因此django提供了一个接口,让开发者能自定义标签和过滤器,使显示达到自己想要的内容或者格式。
- 首先,你需要添加一个templatetags的文件夹, 自定义过滤器必须处在已经安装了的app中的一个名叫”templatetags”的包(文件夹)中。因此可以有两种选择:
1) 一种是放在其他已经安装了的app中。这种方式简单,但不方便管理。
2)单独创建一个app,用来存放所有的自己定义的过滤器。
templatetags 文件夹名字不能修改,这是django规定的。
比如,用pycharm中Tools->Run manage.py Task命令startapp utils创建app,然后再下面建立python包templatetags,pycharm创建文件夹时,不会自动上传所以需要upload到远程服务器上去, 创建完templatetags模块后,重启服务器。
-
使用自定义过滤器,必须把对应的app加载,在settings中添加该app
- 在templatetags下添加一个python文件,如我这里创建一个custom.py文件,在文件中添加对应的自定义过滤器
# 过滤器文件中custom.py:
# -*- coding: utf-8 -*-
from django import template
# 将注册类实例化为register对象
# register = template.Library() 创建一个全局register变量,它是用来注册你自定义标签和过滤器的,只有向系统注册过的tags,系统才认得你。
# register 不能做任何修改,一旦修改,该包就无法引用
register = template.Library()
# 使用装饰器注册自定义过滤器
@register.filter
def certificateNoFilter(val, args = 18): #将身份证从倒数第二个反过来6个数替换为*
# val: 代表管道符左边的参数, 是必须的, 因为自定义过滤器必须使用在变量上,所以必须要
# args: 可配置的,如果有其它的参数,就代表你需要输入一个值
return val[:11] + "******" + val[-1]
- 将过滤器加载到html, 使用自定义的过滤器
#应用urls.py
url(r'^test/',include('TestApp.urls'))
#应用views.py
# -*- coding: utf-8 -*-
class Custom(View):
def get(self,request):
name = '菜鸟突击队'
certificateno = '430224189009104236'
#如果不想指定键值,可以使用locals(),locals()指获取当前能获取到的变量,形成一个字典
return render(request,'custom.html',locals())
#custom.html
自定义过滤器
姓 名:{{name}}
身份证:{{ certificateno }}
用*代替之后的:
{# 加载过滤器所在的文件名,由于templatetags的文件名是固定的,django可以直接找到过滤器文件所在的位置 #}
{% load customFilter %}
{{ certificateno|certificateNoFilter }}
效果:
- 自定义简单标签
#使用装饰器注册自定义标签
@register.simple_tag
def curr_date(args):#args可传参数,根据实际需求而定
return datetime.datetime.now().strftime(args)
自定义标签
时间日期:{% curr_date "%Y-%m-%d"%}
- 自定义包含标签
一种比较普遍的tag类型是只是渲染其它模块显示下内容,这样的类型叫做Inclusion Tag。 常用的模板标签是通过渲染 其他 模板显示数据的。
我们使用include标签时,如果引入的html代码中需要传入变量,则需要在所引入的view视图中获取变量,如果引入的html代码中的变量是一个公共变量,则需要重复获取N次,使用自定义包含标签,可以在定义文件中获取一次即可
#使用装饰器注册自定义包含标签
@register.inclusion_tag('my_menu.html') #将返回值传给my_menu.html去
def my_menu():
menus = ['首页','项目实战','每日一练']
return {'menus':menus}
my_menu.html
--------------菜单栏--------------
{% for menu in menus %}
{{menu}}
{% endfor %}