我们先看看下面这个inclusion_tag:
from django import template
register = template.Library()
@register.inclusion_tag('list.html')
def show_list(my_list):
new_list = []
for l in my_list:
if len(l) > 5:
l = l[:5]
new_list.append(l)
return {'my_list':new_list}
我们知道inclusion_tag的作用是将 上面show_list函数的返回值去渲染list.html,然后将list.html填充到使用这个inclusion_tag的网页中。
下面就用这个作例子:
urls.py
from django.contrib import admin
from django.urls import path
from tags.views import home
urlpatterns = [
path('admin/', admin.site.urls),
path('home/', home),
]
tags.views.py
from django.shortcuts import render
# Create your views here.
def home(request):
my_list = [
'first',
'second',
'third',
]
context = {
'my_list': my_list,
}
return render(request, 'home.html', context)
home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
{% load my_tag %}
<body>
<p> This is home</p>
{% show_list my_list %}
</body>
</html>
list.html
<p>This is list</p>
<ul>
{% for l in my_list %}
<li> {{ l }}</li>
{% endfor %}
</ul>
可以看到我们将my_list这个列表传给show_list,经过show_list处理后,由于second长度大于5,被截去了d,最后在list页面显示出来。
我们看运行结果:
流程:
my_list 传给了show_list这个inclusion_tag, show_list函数的结果交给list.html,并渲染,然后将它整个填充到home.html中使用 show_list这个inclusion_tag的位置。
那么,如果不使用inclusion_tag,有没有可能 实现这样的功能呢?很显示是可能 的。下面以tagtest项目来说明。
urls.py
from django.contrib import admin
from django.urls import path
from tag.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('home/', home),
]
tag.views.py
from django.shortcuts import render
# Create your views here.
def home(request):
my_list = [
'first',
'second',
'third',
]
return render(request, 'home.html', {'my_list': my_list})
home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<p>This is home</p>
{% include 'tag.html' %}
</body>
</html>
tag.html
<p>This is tag </p>
<ul>
{% for l in my_list %}
<li>{{ l }}</li>
{% endfor %}
</ul>
我们看运行结果:
可以看到与上面inclusion_tag唯一的不同是,并没有截取second, 要做到截取可以在views里面直接处理,或者可以通过前端truncate也能实现。
所以,inclusion_tag的应用场景究竟是哪些呢?