1.文件路径配置
存放自定义标签及过滤器的目录是templatetags(必须是这个,因为底层源码里面是有对应的文件去引用的),还是建立在项目中的文件夹内,具体目录如下:
Step 1:在项目目录下,创建个名为common的python包。
Step 2:将common加入到settings文件中的INSTALLED_APP列表中;
Step 3:在common里面创建目录templatetags,在目录中创建自定义过滤器和标签文件。
2.自定义过滤器
2.1 注册自定义过滤器
django.template.Library.fliter()
- 没有参数的例子,有两种注册方式,一种是直接调用函数,另一种是装饰器,首先在新建立的common_extras.py写入自定义过滤器函数:
from django import template
register = template.Library() # 生成注册器(register不能更改,不然底层源码没办法识别)
def my_upper(value): # value自动接收模板变量
return value.upper()
register.filter(my_upper) # 注册方法一
@register.filter('ms') #注册方法2
def my_sort(value):
value.sort()
return value
其中在注册方法二中可以将函数名替换,在本例子中将函数my_sort替换为ms,然后在自己的网页中调用自定义过滤器如下:
{{ course_name|upper }} {# 内置过滤器 #}
{{ course_name|my_upper }} {# 自定义过滤器 #}
{{ li }} <br>
{#{{ li|my_sort }} <br>#}
{{ li|ms }}
- 带参数的例子
在新建立的common_extras.py写入自定义过滤器函数,然后调用自定义的过滤器函数。
@register.filter
def test(value,x):
return value.split(x)
# 传递多个参数
@register.filter
def my_test(value,x):
li = x.split(',')
return value.replace(li[0],li[1])
{{ course_name|test:' '}} <br>
{{ course_name }} <br>
{{ course_name|my_test:' ,-' }}在这里插入代码片
2.2 自定义标签
2.2.1自定义简单标签
有两种方式,一种定好格式,另一种是用户自定义格式。
@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_time1(format_string):
return datetime.datetime.now().strftime(format_string)
@register.simple_tag(takes_context=True) #启用上下文参数
def current_time2(context):
fs = context.get('format_string')
return datetime.datetime.now().strftime(fs)
然后在自己的网页中调用自定义标签如下,过滤器是用|,标签是空格:
{% current_time %}
{% current_time1 '%Y年%m月%d日 %H:%M:%S' %}
{% current_time2 %}
2.2.2 自定义包含标签
现在templates中的文件夹中新建一个html文件
<ul>
{% for i in chioces %}
<li>{{ i }}</li>
{% endfor %}
</ul>
注意键值对需要对应上,chioces需要对应上。
def show_res():
li = ['星期一','星期二','星期三','星期四']
return {'chioces':li}
@register.inclusion_tag('book1/show_tag.html')
def show_res1(li):
return {'chioces':li}
@register.inclusion_tag('book1/show_tag.html',takes_context=True)
def show_res2(context):
li = context.get('li')
return {'chioces':li}
然后在自己的网页中调用自定义标签如下:
{% show_res %}
{% show_res1 li %}
{% show_res2 %}