自定义simple_tag
- app目录下创建templatetags目录
- templatetags目录下创建xxpp.py
- 创建template对象register,注意变量名必须为register
- @register.simple_tagdef func(arg1,arg2): pass
- settings.py文件中注册app,INSTALLED_APPS = ['app']
- 模版文件顶部{% load xxoo %}
- { { 函数名 参数一 参数二}}
django如何传递参数给template对象的?
没错,就是通过views.py的函数传递,例如 render(request,'xxx.html',{'xx':'oo'}),还有其他的方式吗?其实还有url的方式传递参数,这里不再赘述
今天,我们讲解一下template对象,如何与py进行交互,这里的py是指单独的py文件,而不是基于django的py文件
下面看一段简单的代码
首先,我们在app01文件夹下创建一个templatetags目录,然后在创建xxoo.py
from django import templatefrom django.utils.safestring import mark_saferegister = template.Library()@register.simple_tagdef simple_01(): return 'Python'
然后模板文件index.html
{% load xxoo %}Title { % simple_01 %}
注意:自定义simple_tag的4个注意事项
1、在模版文件中 {% load py文件 %}
2、settings.py文件中,注册app,本文自创建app01,所以在INSTALLED_APPS = ['app01']
3、在app01目录下创建目录templatetags,注意必须在app01目录下
4、创建template对象时,变量名固定,必须register,必须为register,必须为register
5、必须重启服务
接下来神奇的事情发生了
进阶
在之前基础上,我们加上参数
from django import templatefrom django.utils.safestring import mark_saferegister = template.Library()@register.simple_tagdef simple_02(a,b): return a + b
{% load xxoo %}Title { % simple_02 1 2 %}
自定义filter
- app目录下创建templatetags目录
- templatetags目录下创建xxoo.py文件
- 创建template的register对象,注意变量名必须为register
- @register.filterdef func(arg1,arg2): pass
- settings.py中注册app,INSTALLED_APPS = ['app']
- 模版文件顶部{% load xxoo %}
- { { 参数一|函数名:'参数二,参数三'}} { { 参数一|函数名:参数二 }},注意:函数名和参数二之间不能有空格
from django import templatefrom django.utils.safestring import mark_saferegister = template.Library()@register.filterdef simple_03(a,b): return a +'-'+ b
{% load xxoo %}Title { { '张杰'|simple_03:'谢娜' }}
自定义simple_tag和filter的优缺点
simple_tag
优点:可以传多个参数
缺点:不能作为if语句的条件
filter
优点:可以作为if语句的条件
缺点:参数最多只能传2个,而且不能有空格,其他的只能通过字符串拼接,然后在分割