Django 模板之自定义过滤器

可以通过模板过滤器来修改变量的显示,过滤器的形式是: {{ variable | filter }}

过滤器可以采用链式的方式使用,例如: {{ text | escape | linebreaks }}

过滤器还可以带参数,例如: {{ text | biltruncate:30 }}

过滤器的参数中如果带有空格,那么需要用引号引起来,例如: {{ list | join:", " }}

 

 示例:

 1 from django.conf.urls import url
 2 from django.contrib import admin
 3 from polls import views
 4 
 5 urlpatterns = [
 6     url(r'^admin/', admin.site.urls),
 7     url(r'^filter1/$', views.filter1),
 8     url(r'^filter2/$', views.filter2),
 9     url(r'^filter3/$', views.filter3),
10     url(r'^filter4/$', views.filter4),
11 ]
urls.py
 1 from django.shortcuts import render
 2 
 3 def filter1(request):
 4     return render(request, 'filter1.html')
 5 
 6 def filter2(request):
 7     return render(request, 'filter2.html')
 8 
 9 def filter3(request):
10     return render(request, 'filter3.html')
11 
12 def filter4(request):
13     return render(request, 'filter4.html')
views.py
1 from django import template
2 
3 register = template.Library()
4 
5 def cut_filter(value, arg):
6     return value.replace(arg, '')
7 
8 register.filter(name='cut_filter', filter_func=cut_filter)
templatetags/poll_filter.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_filter %}
10 {{ "Hello All en" | cut_filter:" " }}
11 </body>
12 </html>
templates/filter1.html

示例2:

1 from django import template
2 
3 register = template.Library()
4 
5 # 使用装饰器简化注册过程,register.filter可传参数name=方法名,默认可不写
6 @register.filter()
7 def cut_filter(value, arg):
8     return value.replace(arg, '')
templatetags/poll_filter2.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_filter2 %}
10 {{ "Hello All en" | cut_filter:" " }}
11 </body>
12 </html>
templates/filter2.html

示例3:

1 from django import template
2 from django.template.defaultfilters import stringfilter
3 
4 register = template.Library()
5 
6 @register.filter()
7 @stringfilter
8 def tolower(value):
9     return value.lower()
templatetags/poll_filter3.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_filter3 %}
10 {{ "Hello All en" | tolower }}
11 </body>
12 </html>
templates/filter3.html

示例4:

 1 from django import template
 2 from django.template.defaultfilters import stringfilter
 3 from django.utils.safestring import mark_safe
 4 
 5 register = template.Library()
 6 
 7 # 原始的字符串会被转义
 8 # 安全的字符串会被转义
 9 # 需要被转义的字符串会被转义
10 # 使用Django的字符串会自动进行转义,但使用自定义的就就是直接输出,没有转义-
11 @register.filter()
12 def add(value, arg):
13     return "%s  %s" %(value, arg)
14 
15 # 使用is_safe参数,设为True强制转义
16 @register.filter(is_safe=True)
17 def add2(value, arg):
18     return "%s  %s" %(value, arg)
19 
20 @register.filter()
21 def add3(value, arg):
22     return mark_safe("%s  %s" %(value, arg))
templatetags/poll_filter4.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_filter4 %}
10 
11 <!--定义一个变量并输出-->
12 {% with "<h1>hello</h1>" as tmpvalue %}
13     <p>{{ tmpvalue|capfirst }}</p>
14 {% endwith %}
15 <br>
16 {% with "<h1>hello</h1>" as tmpvalue2 %}
17     <p>{{ tmpvalue2|add:"world" }}</p>
18 {% endwith %}
19 <br>
20 {% with "<h1>hello</h1>" as tmpvalue3 %}
21     <p>{{ tmpvalue3|add2:"world" }}</p>
22 {% endwith %}
23 <br>
24 {% with "<h1>hello</h1>" as tmpvalue4 %}
25     <p>{{ tmpvalue4|add3:"world" }}</p>
26 {% endwith %}
27 </body>
28 </html>
templates/filter4.html

 

posted @ 2017-05-22 22:02  taibai  阅读(109)  评论(0)    收藏  举报