Django学习笔记之自定义过滤器及标签
目录结构:
在项目目录下 创建个名为common的Python包
将common加入到settings文件中的INSTALLED_APP列表中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions', #
'django.contrib.messages',
'django.contrib.staticfiles',
'book.apps.BookConfig',
'common', #相当于是一个进行注册了的app
]
在common里面创建目录templatetages,在目录里面创建自定义过滤器及标签文件.
**注意:**templatetags这个目录名字是固定的,而里面的模块名是自定义的
在common_extras.py文件中自定义cut和lower的过滤器功能
一.自定义过滤器
# cut 过滤器的功能
def mycut(value,arg):
return value.replace(arg,'')
# 对mycut进行注册
register.filter('mycut',mycut)
注册自定义过滤器:
django.template.Library.filter()
1.Library.filter()方法需要两个参数:
a. 过滤器的名称(一个字符串对象)
b. 编译的函数 – 一个Python函数(不要把函数名写成字符串)
2.可以把register.filter()用作装饰器;
3.没有声明 name 参数,Django将使用函数名作为过滤器的名字。
例子:
from django import template
register = template.Library() #实例化
# 对mycut进行注册
register.filter('mycut',mycut)
# 装饰器 进行注册
@register.filter
def mylower(value):
return value.lower()
使用自定义过滤器:
#需要使用{% load %}标签将我们的自定义模块加载进来
{% load %} 声明将会载入给定模块名中的标签/过滤器
{% load common_extras %} #要写在模板文件第一行
二.自定义标签
1.简单标签django.template.Library.simple_tag()
2.包含标签django.template.Library.inclusion_tag()
tag()方法有两个参数:
1. 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。
2. 编译的函数 – 一个Python函数(不要把函数名写成字符串)
与过滤器注册一样,也可以将其用作装饰器。
自定义简单标签的例子:
1.定义一个显示当前时间的简单标签
@register.simple_tag
def current_time():
return datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')
2.简单标签,传参数,,需传入时间格式
# 简单标签 传参数
@register.simple_tag
def current_time2(format_string):
return datetime.datetime.now().strftime(format_string)
3.注册标签时使用takes_context 参数,则可以使用从上下文中传入的参数.
# 从上下文中传进来参数
@register.simple_tag(takes_context=True)
def current_time3(context):
format_string = context.get('format_string')
return datetime.datetime.now().strftime(format_string)
3.模板中使用自定义的标签
自定义包含标签的例子:
1.包含标签的功能是可以通过渲染另外一个模板来显示一些数据
#例如很多地方都可能会用到下面这几行代码,除了choices这个变量不一样之外,其他的都是格式都一样时,那么我们就可以把这部分代码封装在一个包含标签中.
# music/show_tags.html
<ul>
{% for i in choices %}
<li>{{ i }}</li>
{% endfor %}
</ul>
@register.inclusion_tag('music/show_tags.html')
def show_result():
ls = ['xxx','yyy','zzz']
return {'choice':ls}
2.包含标签 模板里面传参
@register.inclusion_tag('music/show_tags.html')
def show_result2(choice):
# ls = ['xxx','yyy','zzz']
return {'choice':choice}
模板里面传参: {% show_result2 ls %}
3.包含标签 上下文传参
@register.inclusion_tag('music/show_tags.html',takes_context=True)
def show_result3(context):
ls = context.get('ls')
return {'choice':ls}
视图函数(通过上下文传参的参数在这里):
def index5(request):
return render(request, 'music/index5.html',
context={'test':'Abc Def Ghi',
'format_string':'%Y/%m/%d %H:%M:%S',
'ls':ls,
}
)