Django模板之过滤器

过滤器

过滤器用于修改变量或标签参数的值,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 未实现。
c ISO 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'
g 12小时格式,无前导零。 '1'到'12'
G 24小时格式,无前导零。 '0'到'23'
h 12小时格式。 '01'到'12'
H 24小时格式。 '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'
o ISO-8601周编号 '1999'
O 与格林威治时间的差,单位小时。 '+0200'
P 时间为12小时 '1 am','1:30 pm','midnight','noon','12:30 pm'>
r RFC 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'(星期六)
W ISO-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
urlize url转成可点击的链接
urlizetrunc urlize的截断方式
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 }}

如果value123,输出为列表['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>Lawrenceli>
                <li>Topekali>
        ul>
        li>
        <li>Illinoisli>
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 [email protected],输出将是Send questions to [[email protected]](mailto:[email protected])

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 %}
"{% static "images/hi.jpg" %}" alt="Hi!" />

引用JS文件时使用:

{% load static %}
"{% static "mytest.js" %}">

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

{% load static %}
{% static "images/hi.jpg" as myphoto %}
"{{ myphoto }}">

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

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

或者:

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

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

还可以使用变量:

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

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

"/login/">
"/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。

你可能感兴趣的:(Django模板之过滤器)