Django过滤器和标签功能很强大,而且支持自定义标签,很是方便;其中一种标签是Inclusion tags,即包含标签,个人感觉比较反人类的
包含标签(Inclusion tags)通过渲染其他的模板来展示内容,这类标签的用途在于一些相似的内容的展示,并且返回的内容是渲染其他模板得到的内容。
这里我将举个小小栗子我们自定义一个包含标签,这个标签将输出一个列表,我们可以这样使用这个标签
{% task_l %}输出大概是这样的
下面我们一步一步来完成
首先定义一个函数,这个函数返回所有任务列表
def task_l(): task = TaskList.objects.all() return {'task':task}
然后我们创建一个要被渲染的模板用于输出
$ cat templates/t.html
最后使用inclusion_tag函数注册
register.inclusion_tag('t.html')(task_l)
这里写法不要错了,如果写成
...register.inclusion_tag('t.html', task_l)
就会报如下错误
TemplateSyntaxError at /inclusion/
Invalid block tag on line 3: 'task_l'.Did you forget to register or load this tag?
当然还可以通过装饰符
@register.inclusion_tag('t.html')def task_l: ...
还有,别忘了加上
register = template.Library()完整的tag如下:
$ cat templatetags/mytet.py
from django import templatefrom tasklist.models import TaskListregister = template.Library()def task_l(): task = TaskList.objects.all() return {'task':task}register.inclusion_tag('t.html')(task_l)
最后我们构造一个函数用于展示我们的内容
$ cat views.py
def inclusion(request): return render(request, 'inclusion.html', {})
inclusion.html的内容为
$ cat templates/inclusion.html
{% load mytet %}Inclusion Tags
{% task_l %}Done.
需要注意的是,t.html为渲染标签内容的模板,inclusion.html是显示内容的目标模板
最后我们再配置一下url路由
$ cat urls.py
url(r'^inclusion/$', tl_views.inclusion),
之后打开浏览器即可看到效果