Django有许多内置的模板标签(template tags)比如{% if %} ,{% for cate in cate_list %}.... 如果这些模板标签不能满足您的需要,你也可以自己定义模板标签.
Django提供了以下帮助函数(functions)来允许你以一种简单的方式创建自己的模板标签(template tags):
- filter: 过滤器
- simple_tag:处理数据并返回一个字符串(string) , 从前端取数据,然后在后端处理成变量,替换前端. 例子:计算器
- inclusion_tag:处理数据并返回一个渲染过的模板(template),后端处理数据渲染前端页面
模板中自定义函数
- 在已注册的app中创建一个名字叫 templatetags 的包,这个文件夹的名字必须叫它. 这个app,一定在setting.py 中的installapps中已经注册,也就是存在
- 在其下任意创建一个py文件, 比如叫text1.py文件的命名是非常重要的。你将在模板(template)中使用这些模块的名字加载你的标签(tags)。
- 创实例化一个名字叫register 的Library类的对象
- 定义函数
- 在使用自定义simple_tag和filter的html文件中导入之前在templatetags中创建的py文
1、register.filter 过滤器
HTML中的参数传入到函数中当做该函数的参数,然后该函数返回数据给前端渲染页面.
第一个例子:
test1.py中
from django.template import Library
register = Library()
@register.filter
def f(a):
print(a)
return '你好'
html页面:设置为:
{% load text1 %}#先导入这个文件
{{ '小红'|f }}
结果:
后端打印结果为:
小红
前端页面渲染为:
你好
第二个例子:
在前端页面中f2可以先传入个参数,最后会一起传到后端来.,注意后端的f2()中也要有两个参数
from django.template import Library
register = Library()
@register.filter
def f(a1,a2): #这种方法这里只能传两个参数,但是可以放在if判断中
data = '我的名字是{},我喜欢{}'.format(a1,a2)
return data
HTML:
{% load text1 %} #先导入这个文件
{{ '小红'|f:'小明' }} 第二个参数是函数后边紧跟着冒号然后跟参数
页面渲染结果:
我的名字是小红,我喜欢小明
第三个例子:register.filter 用在if 判断 中
text1.py
from django.template import Library
register = Library()
@register.filter
def f(a):
if 'es' in a:
return '你好'
else:
return False
html
{% load text1 %}
{% if 'yesyoucan'|f %}
<p>'回答正确'</p>
{% else %}
<p>'回答错误'</p>
{% endif %}
页面渲染结果:
'回答正确'
2、register.simple_tag
创建text2.py
这个可以传多个参数装饰器和上面的不一样了, 但是这种方法不能放在if判断中
from django.template import Library #这个是传多个参数装饰器和上面的不一样了, 但是这种方法不能放在if判断中
register = Library()
@register.simple_tag
def f(a,b,c,d):
return a+b+c+d
HTML
{% load text2 %} #先导入这个文件
{% f 1 2 3 4 %} #这里的调用方式和
前端页面渲染:
10
3、register.inclusion_tag
inclusion_tag。它多用于一个HTML片段的。
例如:博客首页左侧栏和博客详情、列表页左栅栏的一样的。为了不用重复写同样的代码。且提高页面的扩展性,也可以使用此方法。
或者:在页面中生成一个表:
这里主要以生成表为例:
首先在templatetags创建text3.py:
from django.template import Library
register = Library()
@register.inclusion_tag("zidingyi/list.html")
def list(a):
list = []
for i in range(1, a + 1):
dict = {}
dict['key'] = i
dict['text'] = '%s的平方是%s' % (i, i * i)
list.append(dict)
return {'list':list}
然后在tempaltes创建list.html写一个列表代码块。
<table>
<tr>
<th>key</th>
<th>texy</th>
</tr>
{% for i in list %}
<tr>
<td>{{ i.key }}</td>
<td>{{i.text}}</td>
</tr>
{% endfor %}
</table>
最后在test.html页面中加载自定义模块
{% load text3 %}
{% list 3 %} #3是一个参数。
前端渲染结果:
目录结构: