自定义过滤器、标签、inclusion_tag
先三步走:
1.在应用下创建一个名字”必须“叫templatetags文件夹
2.在该文件夹内创建“任意”名称的py文件 eg:mytag.py
3.在该py文件内"必须"先书写下面两句话(单词一个都不能错)
from django import template
register = template.Library()
urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index',views.index),
]
views.py
from django.shortcuts import render, HttpResponse
def index(request):
# 模板语法可以传递的后端数据类型
n = 123
return render(request, 'index.html', locals())
自定义过滤器
app01/templatetags/mytag.py
from django import template
register = template.Library()
# 自定义过滤器(参数最多两个)
@register.filter(name='baby')
def my_sum(v1, v2):
return v1 + v2
index.html
<body>
# 使用
<h1>自定义过滤器的使用(过滤器只能最多有两个参数)</h1>
{% load mytag %}
<p>{{ n|baby:666 }}</p>
</body>
自定义标签
app01/templatetags/mytag.py
# 自定义标签(参数可以有多个) 类似于自定义函数
from django import template
register = template.Library()
@register.simple_tag(name='plus')
def index(a,b,c,d):
return '%s-%s-%s-%s'%(a,b,c,d)
# 使用
<h1>自定义标签的使用</h1>
标签多个参数彼此之间空格隔开
{% load mytag %}
<p>{% plus 'steven' 123 123 123 %}</p>
自定义inclusion_tag
内部原理:
先定义一个方法
在页面上调用该方法,并且可以传值
该方法会生成一些数据然后传递给一个html页面
之后将渲染好的结果放到调用的位置
app01/templatetags/mytag.py
from django import template
register = template.Library()
# 自定义inclusion_tag
@register.inclusion_tag('left_menu.html')
def left(n):
data = ['第{}项'.format(i) for i in range(n)]
# 第一种
# return {'data':data} # 将data传递给left_menu.html
# 第二种
return locals() # 将data传递给left_menu.html
templates/left_menu.html
# left_menu.html不需要是完整的html格式
<ul>
{% for foo in data %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
index.html
<body>
<h1>inclusion_tag的使用</h1>
{% load mytag %}
{% left 5 %}
</body>
# 总结:当html页面某一个地方的页面需要传参数才能够动态的渲染出来,并且在多个页面上都需要使用到该局部,
那么就考虑将该局部页面做成inclusion_tag形式.