Django inclusion_tag

我们先看看下面这个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的应用场景究竟是哪些呢?

上一篇:Django 模板

下一篇:Django 模型