Django模板过滤器怎么用?用法大全

Django模板过滤器是我们在做SoogorCMS模板时经常需要用到的功能。过滤器看上去是一个“|”,但是|后的功能却是非常多,合理的使用这些功能会给我们在SoogorCMS前端模板开发中增添很大的效率。

过滤器:过滤器用于修改变量或标签参数的值,Django的模板语言中提供了大约六十个内置过滤器。

过滤器的语法: {{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器,例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

注意事项:

  1. 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
  2. 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
  3. 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
  4. '|'左右没有空格
  5. 为模版过滤器提供参数的方式是:过滤器后加个冒号,再紧跟参数,中间不能有空格,目前只能为过滤器最多提供一个参数。
default

如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值。{{ value|default:"nothing"}}。如果value没有传值或者值为空的话就显示nothing

length

返回值的长度,作用于字符串和列表。{{ value|length }},返回value的长度,如 value=['a', 'b', 'c']的话,就显示3。对于未定义的变量,过滤器返回0。

filesizeformat

将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:

{{ value|filesizeformat }}

如果 value 是 123456789,输出将会是 117.7 MB。

slice

切片,如果 value="hello world",还有其他可切片的数据类型

{{value|slice:"2:-1"}}
date

根据给定格式对一个日期变量进行格式化。如果 value=datetime.datetime.now()

{{ value|date:"Y-m-d H:i:s"}}

可用的格式字符串:

格式化字符描述示例输出
a'a.m.'或'p.m.''a.m.'
A'AM'或'PM''AM'
b月份,文字形式,3个字母,小写。“jan”
B未实现。
cISO 8601格式2008-01-02T10:30:00.000123+02:00
d月的日子,带前导零的2位数字。'01'到'31'
D周几的文字表述形式,3个字母。'Fri'
e时区名称'','GMT','-500','US/Eastern'等
E月份,分地区。
f时间'1','1:30'
F月,文字形式。'January'
g12小时格式,无前导零。'1'到'12'
G24小时格式,无前导零。'0'到'23'
h12小时格式。'01'到'12'
H24小时格式。'00'到'23'
i分钟'00'到'59'
I夏令时间,无论是否生效。'1'或'0'
j没有前导零的月份的日子。'1'到'31'
l星期几,完整英文名'Friday'
L布尔值是否是一个闰年。True或False
m月,2位数字带前导零。'01'到'12'
M月,文字,3个字母。“Jan”
n月无前导零。'1'到'12'
N美联社风格的月份缩写。'Jan.','Feb.','March','May'
oISO-8601周编号'1999'
O与格林威治时间的差,单位小时。'+0200'
P时间为12小时'1 am','1:30 pm','midnight','noon','12:30 pm'>
rRFC 5322格式化日期。'Thu, 21 Dec 2000 16:01:07 +0200'
s秒,带前导零的2位数字。'00'到'59'
S一个月的英文序数后缀,2个字符。'st','nd','rd'或'th'
t给定月份的天数。28 to 31
T本机的时区。'EST','MDT'
u微秒。000000 to 999999
U自Unix Epoch以来的秒数(1970年1月1日00:00:00 UTC)。
w星期几,数字无前导零。'0'(星期日)至'6'(星期六)
WISO-8601周数,周数从星期一开始。1,53
y年份,2位数字。'99'
Y年,4位数。'1999'
z一年中的日子0到365
Z时区偏移量,单位为秒。-43200到43200
safe

将字符串标记为安全,不需要转义。Django的模板中在进行模板渲染的时候会对HTML标签和JS等语法标签进行自动转义,比如如果有人给评论的时候写了一段js代码,这个评论一提交,js代码就执行啦,所以浏览器不让这么做,给你转义了。但是有的时候我们不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。

{{ value|safe}}
safeseq

将safe过滤器应用于序列的每个元素。 与对序列进行其他过滤操作(例如join)一起使用时非常有用。

{{ some_list|safeseq|join:", " }}

在这种情况下,不能直接使用safe过滤器,因为它首先将变量转换为字符串,而不是使用序列的各个元素。

truncatechars**

如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“…”)结尾。

参数:截断的字符数

{{ value|truncatechars:9}} 
#注意:9截断出来的是6个字符+3个省略号,配合前端的点击事件就能展开。
truncatewords

在一定数量的字后截断字符串,是截多少个单词,这个以字的个数计数,而不是字符计数。

{{ value|truncatewords:2}} 
如果value是Joel is a slug, 输出为Joel is ...

字符串中的换行符将被删除。
cut

移除value中所有的与给出的变量相同的字符串

{{ value|cut:' ' }}

如果value为'i love you',那么将输出'iloveyou'.

join

使用字符串连接列表,{{ list|join:', ' }},就像Python的str.join(list)。

{{ value|join:" // " }}
如果value是列表['a', 'b', 'c'] ,输出为`a // b // c`。
timesince

将日期格式设为自该日期起的时间(例如,“4天,6小时”)。

采用一个可选参数,它是一个包含用作比较点的日期的变量。例如,如果blog_date是表示2006年6月1日午夜的日期实例,并且comment_date是2006年6月1日08:00,则以下将返回“8 hours”:

{{ blog_date|timesince:comment_date }}

分钟是所使用的最小单位,对于相对于比较点的未来的任何日期,将返回“0分钟”。

timeuntil

类似于timesince,它测量从现在开始直到给定日期或日期时间的时间。例如,如果今天是2006年6月1日,而conference_date是2006年6月29日,则{{ conference_date | timeuntil }}将返回“4 weeks”。

可选参数是一个包含用作比较点的日期变量。如果from_date为2006年6月22日,则以下内容将返回“1 weeks”:

{{ conference_date|timeuntil:from_date }}

Django内置过滤器总览

可以查询下表来总览Django的内置过滤器:

过滤器说明
add加法
addslashes添加斜杠
capfirst首字母大写
center文本居中
cut切除字符
date日期格式化
default设置默认值
default_if_none为None设置默认值
dictsort字典排序
dictsortreversed字典反向排序
divisibleby整除判断
escape转义
escapejs转义js代码
filesizeformat文件尺寸人性化显示
first第一个元素
floatformat浮点数格式化
force_escape强制立刻转义
get_digit获取数字
iriencode转换IRI
join字符列表链接
last最后一个
length长度
length_is长度等于
linebreaks行转换
linebreaksbr行转换
linenumbers行号
ljust左对齐
lower小写
make_list分割成字符列表
phone2numeric电话号码
pluralize复数形式
pprint调试
random随机获取
rjust右对齐
safe安全确认
safeseq列表安全确认
slice切片
slugify转换成ASCII
stringformat字符串格式化
striptags去除HTML中的标签
time时间格式化
timesince从何时开始
timeuntil到何时多久
title所有单词首字母大写
truncatechars截断字符
truncatechars_html截断字符
truncatewords截断单词
truncatewords_html截断单词
unordered_list无序列表
upper大写
urlencode转义url
urlizeurl转成可点击的链接
urlizetruncurlize的截断方式
wordcount单词计数
wordwrap单词包裹
yesno将True,False和None,映射成字符串‘yes’,‘no’,‘maybe’
add

把add后的参数加给value。像这样:

{{ value|add:"2" }}

过滤器首先会强制把两个值转换成Int类型。 如果强制转换失败, 它会试图使用各种方式把两个值相加。如:

{{ first|add:second }}

如果first是[1, 2, 3],second是[4, 5, 6], 将会输出[1, 2, 3, 4, 5, 6].

addslashes

在引号前面加上斜杆。常用于在CSV中转义字符串。

{{ value|addslashes }}

如果value是"I'm using Django", 输出将变成 "I\'m using Django"。

capfirst

大写变量的第一个字母。 如果第一个字符不是字母,该过滤器将不会生效。

{{ value|capfirst }}
center

在给定的宽度范围内居中.

"{{ value|center:"15" }}"
default_if_none

如果(且仅当)value为None,则使用给定的默认值。

{{ value|default_if_none:"nothing" }}
dictsort

接受一个包含字典元素的列表,并返回按参数中给出的键排序后的列表。

{{ value|dictsort:"name" }}

也可以做更复杂的事情,如:

books=[
    {'title': '1984', 'author': {'name': 'George', 'age': 45}},
    {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
    {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]

{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

输出:
* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

dictsort也可以按指定索引对多维列表进行排序,必须提供整数索引,不能是字符串。像这样:

{{ value|dictsort:0 }}

如果value为:

[
    ('a', '42'),
    ('c', 'string'),
    ('b', 'foo'),
]

那么输出将是:

[
    ('a', '42'),
    ('b', 'foo'),
    ('c', 'string'),
]
dictsortreversed

dictsort过滤器的反序功能。

divisibleby

如果value可以被参数整除,则返回True。

{{ value|divisibleby:"3" }}
escape

转义字符串的HTML。转义仅在字符串输出时应用,因此在链接的过滤器序列中escape的位置无关紧要。 如果要立即应用转义,使用force_escape过滤器。

escapejs

转义用于JavaScript字符串的字符。 确保在使用模板生成JavaScript / JSON时避免语法错误。

{{ value|escapejs }}
first

返回列表中的第一项。

{{ value|first }}
floatformat

当不使用参数时,将浮点数舍入到小数点后一位,但前提是要显示小数部分。 像这样:

value           模板语法                输出
34.23234    {{ value | floatformat }}   34.2
34.00000    {{ value | floatformat }}   34

如果与数字整数参数一起使用,将数字四舍五入为小数位数:
34.00000    {{ value | floatformat:3 }} 34.000
34.26000    {{ value | floatformat:3 }} 34.260

传递0(零)作为参数,它将使float浮动到最接近的整数:
34.00000    {{ value | floatformat:“0” }}   34
39.56000    {{ value | floatformat:“0” }}   40

如果传递给floatformat的参数为负,则会将一个数字四舍五入到小数点后的位置,但前提是要显示一个小数部分:
34.23234    {{ value | floatformat:“ - 3” }}    34.232
34.00000    {{ value | floatformat:“ - 3” }}    34
get_digit

给定一个整数,返回所请求的数字,1表示最右边的数字,2表示第二个最右边的数字,以此类推。

{{ value|get_digit:"2" }}
iriencode

将IRI(国际化资源标识符)转换为适合包含在URL中的字符串。

{{ value|iriencode }}
last

返回列表中的最后一个项目。

{{ value|last }}
length_is

如果对象的长度等于参数值,则返回True,否则返回False。

{{ value|length_is:"4" }}
linebreaks

替换纯文本中的换行符为标签。

{{ value|linebreaks }}    
# 如果value是Joel\nis a slug,输出将为Joel is a slug。
linenumbers

显示带行号的文本。

{{ value|linenumbers }}

如果value为:

one
two
three

输出将是:

1. one
2. two
3. three
ljust

给定宽度下左对齐。

"{{ value|ljust:"10" }}"
lower

将字符串转换为全部小写。

{{ value|lower }}
make_list

将对象转换为字符的列表。对于字符串,直接拆分为单个字符的列表。对于整数,在创建列表之前将参数强制转换为unicode字符串。

{{ value|make_list }}

如果value为123,输出为列表['1', '2', '3']。
phone2numeric

将电话号码(可能包含字母)转换为其等效数字。

{{ value|phone2numeric }}
如果value为`800-COLLECT`,输出将为800-2655328。
pluralize

如果值不是1,则返回一个复数形式,通常在后面添加's'表示。

You have {{ num_messages }} message{{ num_messages|pluralize }}.

如果num_messages是1,则输出为You have 1 message。 如果num_messages是2,输出为You have 2 messages

另外如果需要的不是's'后缀的话, 可以提供一个备选的参数给过滤器:

You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.

对于非一般形式的复数,可以同时指定单复数形式,用逗号隔开。例如:

You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.
pprint

用于调试的过滤器。

random

返回给定列表中的随机项。

{{ value|random }}
rjust

右对齐给定宽度字段中的值。

"{{ value|rjust:"10" }}"
slugify

转换为ASCII。空格转换为连字符。删除不是字母数字,下划线或连字符的字符。转换为小写。还会去除前导和尾随空格。

{{ value|slugify }}

如果value是Joel is a slug,输出为joel-is-a-slug

stringformat

根据参数,格式化变量。

{{ value|stringformat:"E" }}

如果value为10,输出将为1.000000E+01。

striptags

尽可能的去除HTML中的标签。

{{ value|striptags }}
time

根据给定的格式,格式化时间。给定格式可以是预定义的TIME_FORMAT,也可以是与date过滤器相同的自定义格式。

{{ value|time:"H:i" }}

如果value等于datetime.datetime.now(),则输出字符串01:23

time过滤器只接受格式字符串中与时间相关的参数,而不是日期

timesince

将日期格式设为自该日期起的时间(例如,“4天,6小时”)。

title

将所有单词的首字母大写,其它字母小写。

{{ value|title }}
truncatechars_html

类似于truncatechars,但是会保留HTML标记。

{{ value|truncatechars_html:9 }}

如果value是Joel is a slug,输出Joel i...

truncatewords_html

类似于truncatewords,但是保留HTML标记。

{{ value|truncatewords_html:2 }}

HTML内容中的换行符将保留。

unordered_list

接收一个嵌套的列表,返回一个HTML的无序列表。

例如,如果var 包含['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']], 那么{{ var|unordered_list }}将返回:

<li>States
<ul>
        <li>Kansas
        <ul>
                <li>Lawrence</li>
                <li>Topeka</li>
        </ul>
        </li>
        <li>Illinois</li>
</ul>
</li>
upper

将字符串转换为全部大写的形式:

{{ value|upper }}
urlencode

转义要在URL中使用的值。

{{ value|urlencode }}

如果value为https://www.example.org/foo?a=b&c=d,输出https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd

urlize

将文字中的网址和电子邮件地址转换为可点击的链接。

该模板标签适用于前缀为http://https://的链接,或者www

由urlize生成的链接会向其中添加rel="nofollow"属性。

{{ value|urlize }}

如果value是Check out www.djangoproject.com,输出Check out [www.djangoproject.com](http://www.djangoproject.com)

除了超级链接之外,urlize也会将电子邮件地址转换为邮件地址链接。 如果value是Send questions to foo@example.com,输出将是Send questions to [foo@example.com](mailto:foo@example.com)

urlizetrunc

将网址和电子邮件地址转换为可点击的链接,就像urlize,但截断长度超过给定字符数限制的网址。

{{ value|urlizetrunc:15 }}

如果value是Check out www.djangoproject.com,将输出Check out [www.djangopr...](http://www.djangoproject.com)'.

与urlize一样,此过滤器应仅应用于纯文本。

wordcount

返回单词的个数。

{{ value|wordcount }}

如果value是Joel is a slug,输出4。

wordwrap

以指定的行长度,换行单词。

{{ value|wordwrap:5 }}

如果value是Joel is a slug,输出为:

Joel
is a
slug
yesno

将True,False和None,映射成字符串‘yes’,‘no’,‘maybe’。

{{ value|yesno:"yeah,no,maybe" }}

国际化标签和过滤器

Django还提供了一些模板标签和过滤器,用以控制模板中国际化的每个方面。它们允许对翻译,格式化和时区转换进行粒度控制。

i18n

此标签允许在模板中指定可翻译文本。要启用它,请将USE_I18N设置为True,然后加载{% load i18n %}

l10n

此标签提供对模板的本地化控制,只需要使用{% load l10n %}。通常将USE_L10N设置为True,以便本地化默认处于活动状态。

tz

此标签对模板中的时区进行控制。 像l10n,只需要使用{% load tz },但通常还会将USE_TZ设置为True,以便默认情况下转换为本地时间。

静态文件相关

Django附带了一些其他模板标签,必须在INSTALLED_APPS设置中显式启用,并在模板中启用{% load %}标记。

static

static标签用于链接保存在STATIC_ROOT中的静态文件。js、css、img等都叫做静态文件,关于django中静态文件的配置,需要在settings配置文件里面写上这写内容:

STATIC_URL = '/static/' 

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'demo'), # 第二个参数就是项目中存放静态文件的文件夹名称
]

# STATIC_URL = '/xxx/' #别名,可以随便写。但是如果你改名字,并且页面里面是通过/xxx/bootstrap.css的时候,如果这里的别名你改成了/static/的话,你前端页面的路径要改成/static/bootstrap.css。所以我们都是用下面的load static的方式来使用静态文件路径。

目录:别名也是一种安全机制,浏览器上通过调试台能够看到的是别名的名字,这样别人就不能知道你静态文件夹的名字了,不然别人就能通过这个文件夹路径进行攻击。

前端页面引入静态文件的写法,因为别名也可能会修改,所以使用路径的时候通过load static来找到别名,通过别名映射路径的方式来获取静态文件。

{% static %}

{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

引用JS文件时使用:

{% load static %}
<script src="{% static "mytest.js" %}"></script>

某个文件多处被用到可以存为一个变量

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>

{% get_static_prefix %}:手动拼接,先获取静态文件包的别名然后再拼接静态文件,一般不使用这个。

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

或者:

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />

还可以使用变量:

{% load static %}
<link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen" />

注意一个html文件中写相对路径时需要注意的一个问题,例子:

<form action="/login/"></form>
<img src="/static/1.jpg" alt="">
等标签需要写路径的地方,如果写的是相对路径,那么前置的/这个斜杠必须写上,不然这个请求会拼接当前网页的路径来发送请求,就不能匹配我们的后端路径了

django.contrib.humanize

一组Django模板过滤器,用于向数据添加“人性化”,更加可读。为了提高模板系统对人类的友好性,Django在django.contrib.humanize中提供了一系列的模板过滤器。

需要把django.contrib.humanize添加到INSTALLED_APPS设置中来激活这些过滤器。然后在模板中使用{% load humanize %}标签,就可以使用下面的过滤器了。

apnumber

对于数字1~9,返回英文单词,否则返回数字本身。 这遵循了出版图书的格式。可以传递整数,或者整数的字符串形式。

intcomma

将整数或浮点数(或两者的字符串表示形式)转换为每隔三位数字包含逗号的字符串。

例如:45000 会变成 45,000

如果启动了Format localization,还将遵循用户本地国家标准。例如,在德语('de')中:450000 会变成 '450.000'。

intword

将大整数(或整数的字符串表示形式)转换为友好的文本表示形式。适用于超过一百万的数字。

例如:1200000 会变成 1.2 million。支持高达10的100次方 (Googol) 的整数。

如果启动了Format localization,还将遵循用户本地国家标准。例如,在德语('de')中:1200000000 会变成 '1,2 Milliarden'。

naturalday

对于当天或者一天之内的日期,返回“today”,“tomorrow”或者“yesterday”的表示形式,视情况而定。否则,使用传进来的格式字符串进行日期格式化。其它的日期,还是按照传统的方法展示。

例如(“今天”是2007年2月17日),16 Feb 2007 会变成 yesterday。

naturaltime

对于日期时间的值,返回一个字符串来表示多少秒、分钟或者小时之前。如果超过一天之前,则回退为使用timesince格式。如果是未来的日期时间,返回值会自动使用合适的文字表述。

例如(“现在”是2007年2月17日16时30分0秒):

17 Feb 2007 16:30:00 会变成 now。
17 Feb 2007 13:31:29 会变成 2 hours ago。
16 Feb 2007 13:30:00 会变成 1 day, 3 hours ago。
17 Feb 2007 16:34:35 会变成 4 minutes from now。
17 Feb 2007 17:30:29 会变成 an hour from now。
18 Feb 2007 16:31:29 会变成 1 day from now。
26 Feb 2007 18:31:29 会变成 1 week, 2 days from now。
ordinal

将一个整数转化为它的序数词字符串。例如:1 会变成 1st。

THE END