自定义过滤器以及标签
自定义模板过滤器
代码布局
- 创建并放在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,同简单标签