自定义过滤器和标签都写在python文件中(.py),所以先新建一个文件夹名字自己取,在这个文件夹下再新建一个文件夹,名字一般写作templatetags,写这个名字,是为了方便与系统连接,最后在templatetags下新建一个python文件, 取个名字,这里叫common_extra.py,然后将新建的最外层那个文件夹名注册到settings.py中的APPS里面
过滤器和标签一般在模版中写的,所以先准备一个模版和一些数据
新建一个模版,取个名字,这里叫test2.html
views.py中
context(上下文)中的数据是传给test2.html模版的
def func(request):
return render(request,'test/test2.html', context={
'name':'liping',
'age':20,
'list':[1,3,11,20,30,33,0,0.9],
'time_format':'%Y %m %d %H:%M:%S',
'showList':['android', 'ios', 'java', 'ai', 'python'],
})
test2.html中
在最上面导入自定义的文件名
{% load common_extra %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义标签和过滤器</title>
</head>
<body>
自定义的排序过滤器
{{ list|my_sort }} <br>
自定义的转大写过滤器
{{ name|myUpper }} <br>
自定义的替换字符串字符过滤器
{{ name|myReplace:'i' }} <br>
<br>
自定义获取当前时间标签
{% current_time %}
<br>
自定义获取当前时间标签 传参数
{% current_time2 '%Y %m %d %H:%M:%S' %}
<br>
自定义的一个简单加法过滤器
{% add 10 100 %}
<br>
自定义的一个获取当前时间,使用上下文数据的过滤器
{% current_time3 %}
<br>
自定义包含标签 使用showTest.html模版
{% showHtml %}
<br>
自定义包含标签 使用showTest.html模版 传参数
{% showHtml2 'android' %}
<br>
自定义包含标签 使用showTest.html模版 使用上下文数据
{% showHtml3 %}
</body>
</html>
common_extra.py文件中
导入template包
from django import template
获取Library对象
register = template.Library()
# 自定义过滤器
自定义的排序
@register.filter
def my_sort(value):
a = sorted(value)
return a
自定义的转大写
@register.filter('myUpper')
def myUp(value):
return value.upper() + ' 自定义'
自定义的替换字符
@register.filter
def myReplace(value, arg):
return value.replace(arg, 'k')
# 自定义简单标签
导入时间包
import datetime
自定义不带参数简单标签
@register.simple_tag
def current_time():
format_string = "%Y年 %m月 %d日 %H:%M:%S"
return datetime.datetime.now().strftime(format_string)
带参数
@register.simple_tag
def current_time2(timeFormat):
return datetime.datetime.now().strftime(timeFormat)
@register.simple_tag
def add(a, b):
c = a + b
return c
使用上下文数据
@register.simple_tag(takes_context=True)#允许使用上下文
def current_time3(context):#这个参数名必须是context
format = context.get('time_format')
return datetime.datetime.now().strftime(format)
# 自定义包含标签
包含标签,就是在一个模块中要展示的一个东西,用另一个模块渲染出来
# 不含参数
@register.inclusion_tag('test/showTest.html')
def showHtml():
arr = ['java', 'ios', 'python', 'web', 'php', 'c']
return {'array':arr}
#包含参数
@register.inclusion_tag('test/showTest.html')
def showHtml2(arr):
return {'array':arr}
# 使用上下文中的数据
@register.inclusion_tag('test/showTest.html', takes_context=True)
def showHtml3(context):
list = context.get('showList')
return {'array':list}
showTest.html中
{% for i in array %}
<button>{{ i }}</button><br>
{% endfor %}