Django模板之自定义过滤器/标签/组件

自定义步骤:

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

2.     app应用中创建templatetags模块包(模块名只能是templatetags)

3.     创建任意 .py 文件,如:my_tags.py

·   导入模块:from django import template

·   实例化注册器:register = template.Library()   #register的名字是固定的,不可改变

4.     在自定义模块(my_tags.py)中定义不同的函数,使用不同注册类进行装饰

·   注册过滤器:@register.filter

自定义过滤器函数的参数最多不能超过两个,第一个参数默认为渲染的变量

·         注册标签:@register.simple_tag

自定义标签函数的参数个数不限

·         注册组件:@register.inclusion_tag("渲染模板.html")

自定义组件标签函数的返回值作为注册器渲染的数据,然后将渲染后的模板返回给调用页面(类似组件)

     5.     在使用自定义过滤器、标签、标签组件时,必须现在html文档首行导入自定义的模块:{% load my_tags %}   

         

 

自定义过滤器演示:

 

app应用中的templatetags包中my_tags.py模块: 

 1 from django import template
 2 register=template.Library()     #register变量名是固定不变的
 3  
 4 @register.filter
 5 def sum_filter(a,b):    #参数最多不超过两个,第一个默认为模板变量
 6     '''
 7     模板变量过滤器,返回值作为渲染结果
 8     :param a: 模板变量
 9     :param b: 给定参数
10     :return: 渲染显示数据
11     '''
12     return a+b 

  my_filters.html

 1 {% load my_tags %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <meta http-equiv="refresh" content="">
 7     <meta name="keywords" content="">
 8     <style></style>
 9     <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
10     <link rel="stylesheet" href="">
11     <title>自定义过滤器</title>
12 </head>
13 <body>
14     <div>
15         <h1>{{ num|sum_filter:10 }}</h1>
16     </div>
17 </body>
18 </html>

  views.py 

1 def my_filters(request):
2     n=10
3     return render(request,"my_filters.html",{"num":n})

  渲染结果:

  

 

自定义标签演示: 

app应用中的templatetags包中模块:

1 from django import template
2 register=template.Library()     #register变量名是固定不变的
3  
4 @register.simple_tag
5 def sum_simple_tag(a,b,c):         #自定义标签参数不限
6     return a+b+c

  my_tags.html 

 1 {% load my_tags %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>自定义标签演示</title>
 7 </head>
 8 <body>
 9     <div><h1>{{ num }} </h1></div>
10     <div><h1>{% sum_simple_tag 2 4 5 %}</h1></div>
11     <div><h1>{% sum_simple_tag num 4 5 %}</h1></div>
12 </body>
13 </html>

  views.py 

1 def my_tag(request):
2     n=10
3     return render(request,"my_tags.html",{"num":n})

  渲染结果:

   

 

 自定义组件标签演示:

app应用中的templatetags包中模块:

 1 from django import template
 2 register=template.Library()     #register变量名是固定不变的
 3  
 4 @register.inclusion_tag("inclusion.html")#组件注册标签类必须参入一个组件模板的html文件接收函数返回值进行渲染
 5 def sum_inclusion_tag(m,n):
 6     '''
 7     自定义组件标签,函数返回值给注册类模板参数渲染,渲染之后的html文件当成组件自动在标签调用页面渲染显示
 8     :param m: 给定的组件标签参数
 9     :param n:给定的组件标签参数 
10     :return: 自定形式的值当场注册类参数模板的模板变量进行渲染
11     '''
12     li=[]
13     for i in range(m,n):
14         li.append(i)
15     return {"list":li}

  inclusion.html 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>注册标签组件</title>
 6 </head>
 7 <body>
 8     <ul>
 9         {% for i in list %}
10             <li>{{ i }}</li>
11         {% endfor %}
12     </ul>
13 </body>
14 </html>

  my_inclusion_tag.html 

 1 {% load my_tags %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>自定义组件标签演示</title>
 7 </head>
 8 <body>
 9     <div>
10         {% sum_inclusion_tag 10 20 %}
11     </div>
12 </body>
13 </html>

  views.py 

def my_inclusion_tag(request):
    return render(request,"my_inclusion_tag.html")

  渲染结果:

   

 

  

其他相关(mark_safe) 

#mark_safe渲染的数据可以被识别成html标签内容 

1 from django import template
2 from django.utils.safestring import mark_safe
3  
4 register = template.Library()   #register的名字是固定的,不可改变
5  
6 @register.simple_tag
7 def my_input(id,arg):
8     result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
9     return mark_safe(result)
posted @ 2019-07-21 17:05  笑得好美  阅读(263)  评论(0编辑  收藏  举报