自定义过滤器以及标签
自定义模板过滤器
代码布局
- 创建并放在app目录下的名为templatetags的文件夹下(规定的name),该文件夹必须是一个pthon的包。这个文件夹一定有一个```__init__.py```文件 - 自定义模板标签或模板过滤器,就放在这个包下到的python模块中(python文件) - app必须再settings中被注册定义过滤器
- 自定义过滤器其实就是一个python函数,他有一个或者 俩个参数 - 第一个参数是传进来的模板变量 - 第二个参数就是一个普通参数,可以实默认参数,也可以不要这个参数注册
#自定义模板过滤器
from django.template import Library
register = Library()#必须用register这个变量名
def my_change_sex(value):
#转换性别的过滤器
map = {
'0': '女',
'1': '男'
}
return map[value]
register.filter(my_change_sex)#代表注册了
在模板中使用
1. load标签,引入自定义的过滤模块,也就是templatetages包里的python文件。例如:```{% load teacher_filters%}``` 2. 注意:新建自定义后,要重启服务器补充:
- name:可以给函数命名。例如:
register.filter(‘aaa',my_change_sex)
将函数名改为了aaa,引用的时候使用aaa就OK。 - 两个参数:
def my_change_sex(value,language='chinese'):
#转换性别的过滤器
map = {
'chinese': {'0': '女', '1': '男'},
'English': {'0': 'woman', '1': 'man'}
}
return map[language][value]
使用修饰器注册:
from django.template import Library
@register.filter(name='change')
def my_change_sex(value,language='chinese'):
#转换性别的过滤器
map = {
'chinese': {'0': '女', '1': '男'},
'English': {'0': 'woman', '1': 'man'}
}
return map[language][value]
自定义模板标签
标签类型
简单标签
- 接收许多参数
创建,注册
代码布局和过滤器一样
from django.template import Library
from datetime import datetime
register = Library()
def current_time(format_str='%Y-%m-%d %H:%M:%S'):
return datetime.now().strftime(format_str)
register.simple_tag(current_time)#注册
应用方法:{% load name %}
使用修饰器:效果一样
from django.template import Library
from datetime import datetime
register = Library()
@register.simple_tag(name='current',takes_context=True)
def current_time(format_str='%Y-%m-%d %H:%M:%S'):
return datetime.now().strftime(format_str)
使用上下文变量
使用当前模板中的上下文变量context
from django.template import Library
from datetime import datetime
register = Library()
def current_time(context,format_str='%Y-%m-%d %H:%M:%S'):
return datetime.now().strftime(format_str)
register.simple_tag(current_time,takes_context=True)#注册
包含标签
通过渲染另外一个模板,来展示数据定义
def show_list(list_data):
return {'ls': list_data}
t = get_template('teacher/show_list.html')
register.inclusion_tag(t)(show_list)#注册
使用装饰器注册:
@register.inclusion_tag('teacher/show_list.html')
def show_list(list_data):
return {'ls': list_data}
举例:
自定义模板:
from django.template import Library
from datetime import datetime
register = Library()
@register.inclusion_tag('teacher/show_list.html')
def show_list(list_data):
return {'ls': list_data}
HTML:(修饰)
<ul>
{% for l in ls %}
<li>{{ l }}</li>
{% endfor %}
</ul>
使用:
<td>
{% show_list student.hobby %}
</td>
效果:
个人心得:
自定义标签的逻辑就是:
- 创建自定义模板
- html上获取视图def传入参数
- 使用自定义模块
- 将参数传递到模块中,模块def进行参数处理
- 处理后返回修饰后的结果
引用上下文变量
加上takes_context=Ture,同简单标签