- 自定义过滤器
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模块后,重启服务器。
image.png -
使用自定义过滤器,必须把对应的app加载,在settings中添加该app
image.png - 在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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义过滤器</title>
</head>
<body>
姓 名:{{name}}<br/>
身份证:{{ certificateno }}<br/>
用*代替之后的:
{# 加载过滤器所在的文件名,由于templatetags的文件名是固定的,django可以直接找到过滤器文件所在的位置 #}
{% load customFilter %}
{{ certificateno|certificateNoFilter }}
</body>
</html>
效果:image.png
- 自定义简单标签
#使用装饰器注册自定义标签
@register.simple_tag
def curr_date(args):#args可传参数,根据实际需求而定
return datetime.datetime.now().strftime(args)
<h3>自定义标签</h3>
时间日期:{% 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
<body>
--------------菜单栏--------------
<br/>
{% for menu in menus %}
{{menu}}
{% endfor %}
</body>
</html>
custom.html
<h3>自定义包含标签</h3>
{% my_menu %}
代码示例:
custom.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义过滤器</title>
</head>
<body>
<h3>自定义过滤器</h3>
姓 名:{{name}}<br/>
身份证:{{ certificateno }}<br/>
用*代替之后的:
{# 加载过滤器所在的文件名,由于templatetags的文件名是固定的,django可以直接找到过滤器文件所在的位置 #}
{% load custom %}
{{ certificateno|certificateNoFilter }}
<br/>
<h3>自定义标签</h3>
时间日期:{% curr_date "%Y-%m-%d"%}
<h3>自定义包含标签</h3>
{% my_menu %}
</body>
</html>
custom.py:
# -*- coding: utf-8 -*-
from django import template
import datetime
# 将注册类实例化为register对象
# register = template.Library() 创建一个全局register变量,它是用来注册你自定义标签和过滤器的,只有向系统注册过的tags,系统才认得你。
# register 不能做任何修改,一旦修改,该包就无法引用
register = template.Library()
# 使用装饰器注册自定义过滤器
@register.filter
def certificateNoFilter(val, args = 18): #将身份证从倒数第二个反过来6个数替换为*
# val: 代表管道符左边的参数, 该值是必须的, 因为自定义过滤器必须使用在变量上,所以必须要有一个val
# args: 可配置的,如果有其它的参数,就代表你需要输入一个值
return val[:11] + "******" + val[-1]
#使用装饰器注册自定义标签
@register.simple_tag
def curr_date(args):#args可传参数,根据实际需求而定
return datetime.datetime.now().strftime(args)
#使用装饰器注册自定义包含标签
@register.inclusion_tag('my_menu.html') #将返回值传给my_menu.html去
def my_menu():
menus = ['首页','项目实战','每日一练']
return {'menus':menus}
views.py:
class Custom(View):
def get(self,request):
name = '菜鸟突击队'
certificateno = '430224189009104236'
#如果不想指定键值,可以使用locals(),locals()指获取当前能获取到的变量,形成一个字典
return render(request,'custom.html',locals())
my_menu.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义包含标签</title>
</head>
<body>
--------------菜单栏--------------
<br/>
{% for menu in menus %}
{{menu}}
{% endfor %}
</body>
</html>
静态文件
- 模板加载静态文件
-
在项目添加一个静态文件夹,并添加需要添加的静态文件(一般名叫static)
image.png - 将新建立的文件夹引入,配置静态文件settings
STATICFILES_DIRS = [os.path.join(BASE_DIR),'static']
3.页面引入:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src = "{% static '/js/test.js' %}"></script>
<link type="text/css" rel="stylesheet" href="{% static '/css/test.css' %}"/>
</head>
<body>
<p>
引入静态文件标签
</p>
</body>
</html>
注意:
- 某些应用提供自定义标签和过滤器库. 要在一个模板中访问它们, 使用 {% load %} 标签:
当你载入一个自定义标签或过滤器库,只有当前模板可以使用这些标签/过滤器 — 继承链中不论是父模板还是子模板都不能使用使用这些标签和过滤器。即哪个页面需要使用,就在哪个页面单独加载,不能通过继承模板方式获得。 - 只要templatetags所在位置是settings.py中INSTALLED_APPS中配置过的,或是在TEMPLATE_DIRS配置过的,任意一个位置便可以。
一定记得要在templatetags文件夹中包含init.py文件。空文件便可。