05-模板层2——模板语法之自定义标签及过滤器与inclusion_tag

简单步骤:

1 app应用文件夹中创建一个叫做templatetags的文件夹
2 在templatetags里面创建一个py文件,例如:mytag.py
3 mytag.py:

from django import template
from django.utils.safestring import mark_safe #mark_safe让字符串形式的标签生效 后面有实例
 
register = template.Library()   #register的名字是固定的,不可改变
 
 
@register.filter
def filter_multi(v1,v2):
    return  v1 * v2

@register.simple_tag  #和自定义filter类似,只不过接收更灵活的参数,没有个数限制。
def simple_tag_multi(v1,v2):
    return  v1 * v2

@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    # 返回字典格式的数据
    return {'ret':mark_safe(result)})

4 在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

{% load my_tags %} 

5 使用simple_tag和filter(如何调用)

-------------------------------.html
{% load xxx %}  
      
# num=12
{{ num|filter_multi:2 }} #24
 
{{ num|filter_multi:"[22,333,4444]" }}
 
{% simple_tag_multi 2 5 %}  参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}

具体例子

在前面的那个实例的基础上自定义一个乘法过滤器:

在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag

如果没有注册的话,在全局的settings.py文件中的 INSTALLED_APPS列表下加上app01:

INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        #上面是既有的,下面是新加的注册app01的语句
        'app01',
]
在app中创建templatetags包(文件夹名只能是templatetags)
在app01应用里面新建一个包(带__init__文件的文件夹):名为templatetags
在app01里创建好的templatetags包中,创建任意的py文件

如:my_tag_filter.py
代码如下:具体的格式背下来:

from django import template
from django.utils.safestring import mark_safe  #mark_safe让字符串形式的标签生效
register = template.Library()   #register的名字是固定的,不可改变  
#自定义乘法过滤器
@register.filter
def filter_multi(v1,v2):
    return  v1 * v2
#自定义乘法标签
@register.simple_tag
def simple_tag_multi(v1,v2):
    return  v1 * v2

@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
     #mark_safe让字符串形式的标签生效
    return mark_safe(result)
在使用自定义simple_tag和filter的html文件中导入之前创建的my_tag_filer.py

例如前面的实例,我们在index.html文件里面先用load引入my_tag_filter再调用:

{# 先用load引入 #}
{% load my_tag_filter %}
 {#自定义过滤器#}
<p>{{ ls.0|filter_multi:3 }}</p>
 {#自定义标签#}
<p>{% simple_tag_multi 5 6 %}</p>
 {#记得给自定义的input传参#}
<p>{% my_input 'w' 'asd' %}</p>
自定义的乘法过滤器与自定义乘法标签的区别
(1)过滤器最多只能定义两个形参,这是由它的调用形式决定的,因为过滤器调用的时候无法穿第三个参数(如上面例子,只能调用ls.0与3)而multi_tag自定义标签可以有多个形参 

(2)但是如果进行“逻辑判断”的时候,就得用自定义过滤器了,因为filter可以用在if等语句后,simple_tag不可以~如:
        {% if num|filter_multi:30 > 100 %}
            <p>{{ num|filter_multi:30 }}</p>
        {% endif %}

inclusion_tag

多用于返回html代码片段

举例说明:

templatetags/my_inclusion.py文件中:
from django import template

register = template.Library()
 #将result.html里面的内容用下面函数的返回值渲染,然后作为一个组件一样,加载到使用这个函数的html文件里面
@register.inclusion_tag('result.html') 
 #参数可以传多个进来
def show_results(n):
    n = 1 if n < 1 else int(n)
    data = ["第{}项".format(i) for i in range(1, n+1)]
    return {"data": data}#这里可以穿多个值,和render的感觉是一样的{'data1':data1,'data2':data2....}
templates/snippets/result.html文件作为片段的内容
<ul>
  {% for choice in data %}
    <li>{{ choice }}</li>
  {% endfor %}
</ul>
templates/index.html文件引入上面的片段
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>inclusion_tag test</title>
</head>
<body>

{% load my_inclusion %}

{% show_results 10 %} 
 <!-- 这个10 是参数 -->
</body>
</html>

inclusion_tag的优秀博客:

Django模版语言inclusion_tag的用法

posted on 2019-05-17 22:01  江湖乄夜雨  阅读(158)  评论(0编辑  收藏  举报