Django 框架之 自定义过滤器
2016-12-17 本文已影响95人
Spareribs
知识点
- 可以通过过滤器来修改变量的显示,过滤器的形式是:{{ variable | filter }},管道符号'|'代表使用过滤器
- 过滤器能够采用链式的方式使用,例如:{{ text | escape | linebreaks }}
- 过滤器还可以带参数,例如: {{ bio|truncatewords:30 }}
- 过滤器的参数中如果带有空格,那么需要用引号引起来,例如:{{ list | join : ", "}}
- django中有30多个内置过滤器 比如add,cut,date等。
参考文档
第十章: 深入模板引擎
代码地址:Spareibs的Github
实验步骤
在templatetags的文件夹下面创建过滤器poll_filter.py
例子一:去掉字符串中的空格
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django进阶课程</title>
</head>
<body>
<p>欢迎来到Django进阶课程</p>
{% load poll_filter %}
{{ "all en" | cut_filter:" " }}
</body>
</html>
from django import template
register = template.Library()
def cut_filter(value, arg):
return value.replace(arg, '')
register.filter(name="cut_filter", filter_func=cut_filter)
或者使用装饰器来注册
from django import template
register = template.Library()
@register.filter()
def cut_filter(value, arg):
return value.replace(arg, '')
例子二:将字母变成小写
from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter()
@stringfilter
def lower(value):
return value.lower()
例子三:Django自定义过滤器是否会自动转义
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django进阶课程</title>
</head>
<body>
<p>欢迎来到Django进阶课程</p>
{% load poll_filter %}
{% with "<h1>hello</h1>" as tmpValue %}
<p>{{ tmpValue | capfirst }}</p>
<hr>
<p>{{ tmpValue | add_no:"world" }}</p>
<hr>
<p>{{ tmpValue | add_yes:"world" }}</p>
{% endwith %}
</body>
</html>
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
# 没有自动转义
@register.filter()
def add_no(value, arg):
return "%s %s" %(value, arg)
# 有自动转义:is_safe 或者mark_safe
@register.filter(is_safe=True)
def add_yes(value, arg):
return mark_safe("%s %s" %(value, arg))