自定义代码标签和布局
1.代码布局:
- 某个app特有的:
- 自定的代码一般需放在app目录下的templatetags文件夹
- 再到templatetags文件夹下创建python模块
- 公用的:
- 创建一个新的app,将python模块定义到新的app中,在INSTALL_APPS注册,然后就可以使用。
2.自定义过滤器
- 过滤器的本质:
- 函数:一个或两个参数
- 第一个参数:传递进来的模板变量
- 第二个参数:普通的参数(可能默认参数,非必须)
- 函数:一个或两个参数
- 过滤器注册
-
1 from django.template import Library 2 3 register = Library() 4 5 def is_male(value, regular='en'): 6 way = { 7 'en': ['女','男',], 8 'cn': ['female','male',], 9 } 10 return way[regular][value] 11 12 register.filter(is_male)
- 实例注册:先实例化一个注册的对象,再调用这个对象的filter方法,filter方法传入需要注册的装饰器函数的函数名。
1 from django.template import Library 2 3 register = Library() 4 5 6 @register.filter() 7 def is_male(value, regular='en'): 8 way = { 9 'en': ['女','男',], 10 'cn': ['female','male',], 11 } 12 return way[regular][value] 13 14 # register.filter(is_male)
- 通过实例对象的装饰器来完成对过滤器函数的调用。
-
- 过滤器的使用
- 现在html中导入过滤器模块{% load 模块 %}
- 再像普通过滤器那样调用即可
- 装饰器函数的第一个参数为所调用的时候传入的值。
3.自定义模板标签
- 简单标签
- 简单标签的定义和自定义过滤器的方式一样
1 from django.template import Library 2 from datetime import datetime 3 4 register = Library() 5 6 @register.simple_tag() 7 def current_time(format_str): 8 return datetime.now().strftime(format_str) 9 10 11 # register.simple_tag(current_time)
- 调用的是实例对象的simple_tag方法
- 引用上下文参数:
- 引用上下文的模板变量(views函数中render传递的context变量的值)
- 在标签函数的注册方法中将take_tcontext=True。
- 将标签函数的第一个参数设置为context
- 引用上下文的模板变量(views函数中render传递的context变量的值)
1 from django.template import Library 2 from datetime import datetime 3 4 register = Library() 5 6 @register.simple_tag(takes_context=True) 7 def current_time(context): 8 return datetime.now().strftime(context['format_str']) 9 10 11 # register.simple_tag(current_time)
4.包含标签(嵌套标签)
- 为避免某一样式重复使用,django提供了包含标签
- 首先定义样式
1 <ul> 2 {% for i in ls%} 3 <li>{{ i }}</li> 4 {% endfor %} 5 </ul>
- 注册样式
1 from django.template import Library 2 3 register = Library() 4 5 6 # register.simple_tag(current_time) 7 @register.inclusion_tag('crm/show_list_as_ul.html') 8 def show_list_as_ul(value): 9 return {'ls': value}
使用实例library的实例对象的inclusion_tag方法,该方法接收一个样式的路径的字符串,最后就可以像普通标签一样是使用该样式了。
- 接收上下文变量和上面一样,将take_context=True,函数的第一个变量设置为context即可!