作者: | Django 团队 |
---|---|
译者: | weizhong2004@gmail.com |
翻译开始日期: | 2006-04-06 |
翻译完成日期: | 2006-04-07 |
更新日期: | 2006-07-03 |
原文版本: | 3185 |
Django 的模板语言的设计原则在动力和易用性之间取得均衡.(功能要足够强大,还要容易使用), 如果你以前使用过 HTML,你会觉得很容易上手.如果有其它基于文本的模板语言的经验, 比如 Smarty
或 CheetahTemplate
, 你会觉得..使用django模板..就象在自己家里一样.
Templates
一个模板就是一个文本文件. 通过模板可以生成任意的基于文本的格式文件(HTML, XML, CSV, etc.).
一个模板包含 变量
, 当模板被求值时,这些变量就被它们的值代替.而 标签
则控制着模板的逻辑.
下面是一个最小化的模板,它演示了某些基本概念. 其中的每个元素都会在本文档的后面部分被详细解释.:
{% extends "base_generic.html" %}
{% block title %}{{ section.title }}{% endblock %}
{% block content %}
<h1>{{ section.title }}</h1>
{% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
{{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
哲学
为什么使用基于文本的模板系统而不是基于 XML (类似 Zope 的 TAL)? 我们希望 Django
的模板语言能比那些 XML/HTML 模板更可用.在 World Online, 我们使用它处理 e-mails, JavaScript 和
CSV. 你能使用这种模板语言生成任何基于文本的格式.
哦,还有一个理由,那就是我们认为除非一个人有受虐趋向,否则谁也不愿意手工编辑 xml。
Variables
变量的形式: {{
variable
}}
. 当模板引擎遇到一个变量时,就会对变量求值,并在变量所在的位置用变量的值取代变量名,然后输出.
使用句点 (.
) 可以访问变量的属性.
幕后
技术上,当模板系统遇到 句点, 它会按顺序尝试进依次查询:
- Dictionary lookup
- Attribute lookup
- Method call
- List-index lookup
在上面的例子中, {{
section.title
}}
会被 section
对象的 title
属性替换.
如果你用到的一个变量不存在,模板系统会插入一个值:TEMPLATE_STRING_IF_INVALID
,这个值在 settings 中定义, 默认设置是一个空的字符串.
参见下面的 使用内建参考
, 这会帮助你发现给定模板中有哪些变量可用.
你可以使用 过滤器
来修改变量的显示.
过滤器
通过使用 过滤器
,可以定制变量的显示格式。
过滤器的形式: {{
name|lower
}}
. 这将显示 {{
name
}}
变量通过 lower
过滤后的值. 它将文本转换为小写. 使用管道符号 (|
) 应用一个过滤器.
过滤器可以 "链接". 一个过滤器的输入作为下一个过滤器的输入: {{
text|escape|linebreaks
}}
是一个常用过滤器组合,用于将文本内容转义然后将换行转换成 <p>
标签.
有些过滤器能接受参数. 一个带有参数的过滤器看起来这样: {{
bio|truncatewords:"30"
}}
. 它用来显示 bio
变量的前 30 个. 过滤器参数总是带有比引号.
下文中的 内建过滤器参考
描述了所有的内建过滤器.
标签
标签看起来这样: {%
标签
%}
. 标签比起变量来复杂的多: 它负责在输出中创建一些文本,执行循环或逻辑分支, 装入额外信息以供后面的模板变量使用等等.
有些标签要求有开始标记和结束标记 (也就是 {%
tag
%}
...
标签内容
...
{%
endtag
%}
). 下文中的 内建标签参考
描述了所有的内建标签.你也可以创建你自己的标签, 如果你会写 Python 代码的话.
模板继承
Django 模板引擎最强大的 -- 也是最复杂的 -- 部分是模板继承. 模板继承允许你建立一个基本的 "骨架" 模板, 它包含你所有最常用的站点元素并定义了一些可以被子模板覆盖的 块
.
通过下面的例子你很容易理解模板继承:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}My amazing site{% endblock %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
我们称它为 base.html
, 定义了一些简单的 HTML 骨架文档, 你可以把它用到一些简单两列的网页上. "子" 模板的任务就是用内容填写这些空白的内容块.
在这个例子里, {%
block
%}
标签定义了三个子模板要填写的 block . 所有的 block
标签告诉模板引擎,模板的这些部分可以被子模板覆盖.
一个子模板类似下面这样:
{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block content %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
这里的 {%
extends
%}
标签是最关键的. 它告诉模板引擎这个模板 "扩展" 了另一个模板. 当模板系统要应用该模板时,首先它会去寻找父模板--在这里是 "base.html" .
模板引擎会注意到在 base.html
里有三个 block 并用子模板的相关内容替换这些 block. 用 blog_entries
里的值填写父模板之后, 最后的输出可能看起来象这样:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>My amazing blog</title>
</head>
<body>
<div id="sidebar">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
</div>
<div id="content">
<h2>Entry one</h2>
<p>This is my first entry.</p>
<h2>Entry two</h2>
<p>This is my second entry.</p>
</div>
</body>
注意由于子模板并未定义 sidebar
block, 父模板中的值就被保留.
对模板的继承层数,Django未做任何限制. 常用的一种模板继承方法是如下的三层:
* 创建一个 ``base.html`` 模板,用它表现站点主要的外观。
* 为站点的每个 section 创建一个 ``base_SECTIONNAME.html`` 模板。比如 ``base_news.html``,``base_sport.html``等等, 这些模板扩充了 ``base.html`` 并包括 section 特有的样式和设计。
* 为每种类型的页面创建一个独立的模板,比如一篇新闻稿或者一个博客,这些模板扩展了相应的 section 模板。
这种方式能够最大程度的重用代码并能很容易的扩充内容及共享内容区块,比如 section-范围的导航。
下面是使用模板继承的一些小技巧:
* 如果你在模板中使用了 ``{% extends %}`` ,那么它必须是这个模板中的第一个模板 tag ,否则它就不工作。
* 在父模板中 ``{% block %}`` 标签虽然不是越多越好,总得来说多比少好. 记住,子模板不需要定义所有的 parent block, 因此你可以先定义一系列 blocks 并填入合理的默认值, 然后定义那些你以后才需要的 block. It's better to have more hooks than fewer hooks.
* 如果发现在一堆模板文件中重复定义相同的内容, 就意味着需要将这些内容放到父模板的一个 ``{% block %}`` 中去.
* 如果你需要在子模板中引用父模板中的 block 的内容,使用 ``{{ block.super }}`` 变量. 这在你希望在父模板的内容之后添加一些内容时会很有用.(你不必完全覆盖父模板的内容.)
最后, 提醒你不能在一个模板文件中定义多个相同名字的 {%
block
%}
标签.
使用内建参考
Django 自带的 admin site 内建一个当前站点的所有模板标签及过滤器的参考. 要查阅这个参考, 进入 admin 站点,然后点击页面右上角的 "Documentation" 链接(如果你的语言选择的是中文,你会看到一个 "文档" 链接)..
这个参考分为四大部分:tags, filters, models, 和 views.
tags
和 filters
部分描述了所有的内建标签(事实上, 下文中的标签和过滤器 参考直接来自那些页面)和所有自定义标签或过滤器 库(如果有的话).
views
页是最有价值的.你站点中的每个 URL 都有一个入口在这儿, 点击这个 URL 你会看到:
- 生成该页面的 view 函数的名字
- 该 view 功能的一个简短的描述.
- 该 view 的 context
, 或者该 view 对应模板中的可用变量列表- 模板的名字,或该模板使用到的模板名字
每个 view 文档页还有一个 bookmarklet , 使用它你可以任意页跳回到这个 view 页.
由于 Django 站点通常会用到数据库对象, 文档页的 models
小节描述了系统中每个对象的类型及那个对象的所有可用字段.
总得来说, 文档页会告诉你给定模板的每个标签, 每个过滤器,每个变量和对象的细节信息.
自定义标签及过滤器库
某些应用提供自定义标签和过滤器库. 要在一个模板中访问它们, 使用 {%
load
%}
标签:
{% load comments %}
{% comment_form for blogs.entries entry.id with is_public yes %}
在上面这个例子里, load
标签载入 comments
标签库, 之后 comment_form
标签才能使用. 参考你的 admin 界面的文档部分你会发现一个自定义库的列表.
{%
load
%}
标签可接受空隔分隔的多个库的名字作为参数.
比如:
{% load comments i18n %}
自定义库及模板继承
当你载入一个自定义标签或过滤器库, 只有当前模板可以使用这些标签/过滤器 -- 继承链中不论是父模板还是子模板都不能使用使用这些标签和过滤器.
举例来说, 如果一个模板 foo.html
内有 {%
load
comments
%}
指令, 一个子模板(也就是一个模板内有 {%
extends
"foo.html"
%}
指令将 不能
访问 comments 模板标签和过滤器. 子模板必须自己负责 {%
load
comments
%}
才可以使用这个库.
这是为了模板逻辑的清晰性和可维护性有意而为的一个特性.
内建标签和过滤器参考
下面的标签和过滤器参考就是为那些没有 admin 站点的可用的人准备的.由于 Django 是高度可定制的,你的 admin 里的关于标签和过滤器的参考可以认为是最可信的.
内建标签参考
comment
注释.模板引擎会忽略掉 {%
comment
%}
和 {%
endcomment
%}
之间的所有内容.
cycle
在循环时轮流使用给定的字符串列表中的值.
在一个循环中, 在循环过程中的每次循环里轮流使用给定的字符串列表元素:
{% for o in some_list %}
<tr class="{% cycle row1,row2 %}">
...
</tr>
{% endfor %}
在循环之外, 在你第一次调用它时给这些字符串值定义一个不重复的名字,然后在循环中使用这个名字:
<tr class="{% cycle row1,row2,row3 as rowcolors %}">...</tr>
<tr class="{% cycle rowcolors %}">...</tr>
<tr class="{% cycle rowcolors %}">...</tr>
你可以使用任意数量的逗号分隔的值.只有一点请你注意,不要在值与值之间放任何空隔--仅仅只有一个逗号即可.
debug
输出完整的调试信息,包括当前的上下文及导入的模块信息.
extends
当前模板 扩展 父模板的一个信号(标记).
这个标签有两种使用方式: {%
extends
"base.html"
%}
(带双引号) 使用 "base" 作为要扩展的父模板的名字.或者 {%
extends
variable
%}
使用 variable
的值作为要扩展的父模板的名字.
参阅 模板继承
以了解更多信息.
filter
用来过滤变量的值.
允许多级过滤, 并且他们可以带有参数运行 -- just like in variable syntax.
示例:
{% filter escape|lower %}
文本将被 HTML-转义, 并且全部转化为小写
{% end过滤器 %}
firstof
输出传递给它的第一个不是 False 的变量值. 如果所有的变量都是 False 那就不输出任何东西.
示例:
{% firstof var1 var2 var3 %}
它等价于:
{% if var1 %}
{{ var1 }}
{% else %}{% if var2 %}
{{ var2 }}
{% else %}{% if var3 %}
{{ var3 }}
{% endif %}{% endif %}{% endif %}
for
循环. 比如要显示一个 athlete_list
中的全部运动员:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
通过使用 {%
for
obj
in
list
reversed
%}
你也可以实现反序循环.
在循环过程中 for 循环会设置以下的一系列变量:
Variable Description forloop.counter
当前循环次数 (1-indexed) forloop.counter0
当前循环次数 (0-indexed) forloop.revcounter
倒序循环时当前循环次数(1-indexed) forloop.revcounter0
倒序循环时当前循环次数(0-indexed) forloop.first
如果当前循环是循环过程的第一次则为True forloop.last
如果当前循环是循环过程的最后一次则为True forloop.parentloop
对嵌套循环, 当前循环之上的循环
if
{%
if
%}
标签对一个变量求值, 若这个变量为 "true" , 就输出 if
内容块:
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% else %}
No athletes.
{% endif %}
在上例中, 如果 athlete_list
非空, 运动员人数就会通过 {{
athlete_list|length
}}
变量显示出来.
就象你刚刚看到的, if
标签可以带一个 {%
else
%}
子句,用来当 if
测试失败后输出相应的内容块.
if``标签可以使用
``and
,``or`` 或 not
来测试一系列变量或否定一个给定的变量:
{% if athlete_list and coach_list %}
Both athletes and coaches are available.
{% endif %}
{% if not athlete_list %}
There are no athletes.
{% endif %}
{% if athlete_list or coach_list %}
There are some athletes or some coaches.
{% endif %}
{% if not athlete_list or coach_list %}
There are no athletes or there are some coaches (OK, so
writing English translations of boolean logic sounds
stupid; it's not our fault).
{% endif %}
{% if athlete_list and not coach_list %}
There are some athletes and absolutely no coaches.
{% endif %}
为避免造成歧义, if``标签不允许在一个
tag
中同时有
``and
和 or
逻辑; 举个例子,下面这个语句不能工作:
{% if athlete_list and coach_list or other_list %}
如果确实需要组合条件,可以使用嵌套的 if
实现相同的功能:
{% if athlete_list %}
{% if coach_list or other_list %}
We have athletes and , either coaches or others.
{% endif %}
{% endif %}
ifchanged
检查一个变量自上次循环之后是否发生了改变.(我的理解:主要用于过滤掉重复的值)
'ifchanged' block标签用于循环中. 它根据自身上次的状态检查自己值, 只有值发生变化时才显示这个值:
<h1>Archive for {{ year }}</h1>
{% for day in days %}
{% ifchanged %}<h3>{{ day|date:"F" }}</h3>{% endifchanged %}
<a href="{{ day|date:"M/d"|lower }}/">{{ day|date:"j" }}</a>
{% endfor %}
ifequal
若两个参数相等,输出一个内容块.
例子:
{% ifequal user.id comment.user_id %}
...
{% endifequal %}
如同 {%
if
%}
tag, 它也支持一个可选的 {%
else
%}
子句.
参数可以是变量,也可以是字符串字面值, 也就是说下面这样也是合法的:
{% ifequal user.username "adrian" %}
...
{% endifequal %}
ifnotequal
类似 ifequal
, 只是它用来测试两个参数是否不等.
include
载入一个模板并根据当前上下文渲染它.用于在一个模板中包含其它模板.
模板名字可以是一个变量,也可以是一个字符串(带引号的字符串,无所谓单引号还是双引号).
下面这个例子包含了 "foo/bar.html"
模板的内容:
{% include "foo/bar.html" %}
下面这个例子包含了另一个模板(该模板的名字为变量 template_name
的值)的内容:
{% include template_name %}
被包含的模板使用包含它的模板的上下文(也就是环境)进行渲染(求值),下面这个例子输出 "Hello,
John"
:
Context: variable person
is set to "john"
.Template:
{% include "name_snippet.html" %}The name_snippet.html
template:Hello, {{ person }}
参阅: {%
ssi
%}
.
now
显示当前日期, 根据给定的字符串决定输出格式.
使用和 PHP 的 date()
函数一样的格式码 (http://php.net/date
) 并做了一些扩展
可用的格式字符串:
格式字符 描述 输出示例 a 'a.m.'
或 'p.m.'
(注意,它与PHP
的输出略有不同.它包括了句点(django扩展).'a.m.'
A 'AM'
或 'PM'
.'AM'
B 未实现. d 每月第几天, 带前导零 '01'
to '31'
D 每周第几天,3字母的字符串. 'Fri'
f 时间, 12-小时制的小时和分钟数,
如果分钟数为零,则不显示.(django 扩展).'1'
, '1:30'
F 月份, 长文本格式. 'January'
g 小时, 12-小时制,没有前导零 '1'
to '12'
G 小时, 24-小时制,没有前导零 '0'
to '23'
h 小时, 12-小时制,有前导零 '01'
to '12'
H 小时, 24-小时制,有前导零 '00'
to '23'
i 分钟. '00'
to '59'
I 未实现 j 每月第几天, 无前导零 '1'
to '31'
l 每周第几天,长文本格式. 'Friday'
L 是否闰年. True
or False
m 数字表示的月份,有前导零. '01'
to '12'
M 月份,3字母短文本格式. 'Jan'
n 数字表示的月份,无前导零 '1'
to '12'
N 出版风格的月份缩写(django 扩展) 'Jan.'
, 'Feb.'
, 'March'
, 'May'
O 与格林威治的时间差(以小时计) '+0200'
P 12小时制的小时分钟及'a.m.'/'p.m.'
分钟数若为零则不显示. 用字符串表示特殊
的时间点, 如 'midnight' 和 'noon'
(django扩展)'1
a.m.'
, '1:30
p.m.'
, 'midnight'
, 'noon'
, '12:30
p.m.'
r RFC 822 格式的日期 . 'Thu,
21
Dec
2000
16:01:07
+0200'
s 秒数, 带有前导零的数字表示 '00'
to '59'
S 英语序数后缀,用于一个月的第几天,2个字符 'st'
, 'nd'
, 'rd'
or 'th'
t 给定月共有多少天. 28
to 31
T 本机时区. 'EST'
, 'MDT'
U 未实现 w 一周中的第几天,没有前导零的数字 '0'
(Sunday) to '6'
(Saturday)W ISO-8601 一年的第多少星期数, 一周从
星期一开始1
, 23
y Year, 2 位数字表示 '99'
Y Year, 4 位数字表示 '1999'
z 一年中的第几天 . 0
to 365
Z 以秒计的时区偏移量. 这个偏移量对UTC西部
时区总是负数,而对UTC东部时区则总是正数-43200
to 43200
例子:
It is {% now "jS F Y H:i" %}
注意你可以使用反斜线转义一个格式字符串中的敏感字符.(如果你想使用其原始值的话).在下面这个例子里, "f" 被用反斜线转义, 因为
"f" 本身是一个用于显示时间的格式字符. "o" 不需要被转义,因为它不是一个格式字符.:
It is the {% now "jS o/f F" %}
(显示 "It is the 4th of September" %}
regroup
Regroup a list of alike objects by a common attribute.
要搞懂这个复杂的标签, 最好还是用一个例子来说明(一幅图胜过千句话): 有一个 people
对象,它是一个 Person
对象(拥有 first_name
, last_name
及 gender
属性)的列表. 你想显示一个象下面这样的列表:
- Male:
- George Bush
- Bill Clinton
- Female:
- Margaret Thatcher
- Condoleezza Rice
- Unknown:
- Pat Smith
下面的模板代码片断可以完成这个看上去复杂的任务:
{% regroup people by gender as grouped %}
<ul>
{% for group in grouped %}
<li>{{ group.grouper }}
<ul>
{% for item in group.list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
如同你看到的, {%
regroup
%}
生成一个变量包含一个对象的列表. 列表中的每个对象都拥有 grouper
和 list
属性. grouper
装有分组的条目; list
包含一系列拥有共同 grouper
属性的对象. 在这个例子里, grouper
可能是 Male
, Female
和 Unknown
, 而 list
则是属于这几种性别的人的列表.
注意当这个被分组的列表没有按你要分组的键排序时, {%
regroup
%}
将不能工作! 这就是说你的 people 列表如果没有按 gender
排序, 你就必须得保证在使用它之前先将它排好序,也就是:
{% regroup people|dictsort:"gender" by gender as grouped %}
spaceless
将HTML标签之间的空白格式化为一个空格. 空白包括空格,换行,制表符.
示例:
{% spaceless %}
<p>
<a href="foo/">Foo</a>
</p>
{% endspaceless %}
这个例子将返回这样的HTML:
<p> <a href="foo/">Foo</a> </p>
只有 标签
之间的空白被处理 -- 标签与文本之间的空白不会被处理.在下面这个例子里, Hello
周围的空白不会被缩小:
{% spaceless %}
<strong>
Hello
</strong>
{% endspaceless %}
ssi
在页面中输出给定文件的内容.
类似一个简单的 "include" 标签, {%
ssi
%}
包含另一个文件的内容 -- 不过必须在当前页面指定一个绝对路径
{% ssi /home/html/ljworld.com/includes/right_generic.html %}
如果提供了可选的 "parsed" 参数, 被包含文件的内容会使用当前的上下文作为模板代码进行求值处理.:
{% ssi /home/html/ljworld.com/includes/right_generic.html parsed %}
注意如何你使用 {%
ssi
%}
, 出于安全考虑, 你需要在你的 Django
settings
文件中定义 ALLOWED_INCLUDE_ROOTS
.
参阅: {%
include
%}
.
templatetag
输出一个组成模板标签的字符.
由于模板系统没有 "转义" 的概念, 要显示一个组成模板标签的字符, 你必须使用 {%
templatetag
%}
标签.
用参数告诉标签输出哪些内容:
参数 输出 openblock
{%
closeblock
%}
openvariable
{{
closevariable
}}
openbrace
{
closebrace
}
widthratio
要创建柱形图的话, 这个标签计算给定值与最大值的比率再乘以100,四舍五入为整数,最后输出这个整数.
例子:
<img src="bar.gif" height="10" width="{% widthratio this_value max_value 100 %}" />
上例中, 如果 this_value
是 175 而 max_value
是 200, 则上例中的图片应该是 88 像素宽 (因为 175/200 = .875; .875 * 100 = 87.5
四舍五入为 88).
内建过滤器参考
add
返回参数与被处理数据相加的结果.
addslashes
给敏感字符添加斜线(转义). 举例,要将一个字符串传递给 JavaScript 时..
capfirst
大写被处理数据的第一个字母.
center
按给定宽度将待处理数据居中.
cut
将待处理数据中的所有子串删除(该子串等于 cut 的参数)
date
根据给定的格式(与 now
标签相同)格式化一个日期.
default
如果值不可用,使用提供的默认值.
default_if_none
如果值为 None
, 使用这个给定的默认值.
dictsort
接受一个字典列表,返回按给定参数的属性排序后的列表.
dictsortreversed
接受一个字典列表,返回按给定参数的属性逆序排序后的列表.
divisibleby
如果值可以被参数除尽,则返回 True.
escape
对一个字符串的敏感字符进入转义(以用于HTML). 特别是它会做如下替换:
- "&"
to "&"
- <
to "<"
- >
to ">"
- '"'
(double quote) to '"'
- "'"
(single quote) to '''
filesizeformat
将值格式化为 '可读性好的' 文件大小(比如 '13
KB'
, '4.1
MB'
, '102bytes'
等等).
first
返回列表中的第一个元素.
fix_ampersands
将 &
符号替换为 &
实体.
get_digit
提供一个完整的数, 返回该数中被请求的数字,其中 1 是最右边的数, 2 是从右边数第二个数字等等. 若输入值非法(若输入或参数不是整数, 或者参数小于1)则返回其原始值. 否则输出就总是整数.
join
用一个字符串将一个列表连接起来, 类似 Python 的 str.join(list)
.
length
返回值的长度. 对列表特别有用.
length_is
若值的长度与参数相等,返回 True, 否则返回 False.
linebreaks
将换行符转化为 <p> 和 <br />.
linebreaksbr
将换行符转化为 <br />.
linenumbers
带行号显示文本.
lower
将字符串转化为小写.
make_list
将值转化为一个列表.对一个整数,它是一个数字的列表.对一个字符串,这是一个字符的列表.
phone2numeric
将一个电话号码(可能包含字母)转化等价的数字值.比如: '800-COLLECT'
将被转化为 '800-2655328'
.
输入不一定非是一个合法号码. 它可以转化任意字符串.
pluralize
如果值不是 1 的话返回 's' 用于 '1 vote' vs. '2 votes' 这种场合. 例如:
you have {{number_messages}} mail{{number_messages|pluralize}}.
(对中国人用处不大,嘿嘿)
pprint
pprint.pprint 和一个封装器-- 仅用于调试.
random
返回随机的从列表中返回一个元素
removetags
从输出中删除单空格分隔的 [X]HTML标签 列表
slice
返回一个列表的片段.
使用与 Python 的 list 相同的语法, 参阅 http://diveintopython.org/native_data_types/lists.html#odbchelper.list.slice
以了解更详细的信息.
示例: {{
some_list|slice:":2"
}}
slugify
转化为小写, 移去非单词字符(字母数字和下划线),将空白转化为连字符,去除前后空白.
stringformat
根据给定参数(一个格式字符串)格式化一个变量, 这个格式字符串使用 Python 字符串格式化语法, 例外之处是 "%" 运算符被省略.
参阅 http://docs.python.org/lib/typesseq-strings.html
以了解 Python 格式字符串
striptags
过滤掉[X]HTML标签.
time
根据给定的格式, 格式化一个时间(与 now
标签使用的格式相同).
timesince
格式化一个日期,这个日期是从给定日期到现在的天数和小时数(比如: "4 days, 6 hours").
接受一个可选的参数,该参数是一个包含比较日期的变量(该参数默认值是 now
).
举例来说, 如果 blog_date
是一个日期实例表示 2006-06-01 午夜, 而 comment_date
是一个日期实例表示 2006-06-01 早上8点,那么
{{
comment_date|timesince:blog_date
}}
将返回 "8 hours".
timeuntil
类似 timesince
, 只是它比较当前时间直到给定日期时间。举例来说,如果今天是 2006-06-01 而
conference_date
是 2006-06-29, 那么 {{
conference_date|timeuntil
}}
将返回 "28 days".
接受一个可选的参数,该参数是一个包含比较日期的变量(该参数默认值是 now
).
举例来说, 如果 from_date
是一个日期实例表示 2006-06-22, 那么 {{
conference_date|timeuntil:from_date
}}
会返回 "7 days".
title
按标题格式转化一个字符串
unordered_list
递归的接受一个自嵌套的列表并返回一个HTML无序列表(此列表可不是pythob语义中的列表) --
只是没有开始和结束的<ul>标签.
假定该列表是合适的格式. 举例来说, 如果 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
将一个字符串全部转为大写.
urlencode
转义该值以用于 URL.
urlize
将普通文本的 URL 转化为可点击的链接.
wordcount
返回单词数
yesno
提供一个字符串参数对应着 true, false 和 (可选的) None,
根据被处理的值返回相应的字符串:
Value | Argument | Outputs |
---|---|---|
True |
"yeah,no,maybe" |
yeah |
False |
"yeah,no,maybe" |
no |
None |
"yeah,no,maybe" |
maybe |
None |
"yeah,no" |
"no" (如果没有对应 None 的字符 串,就将 None 转化为 False 处理 |
其它 tags 和 filter 库
Django 自带了几个其它的模板 tag 库,要使用这些 tag 库,必须显式的在 INSTALLED_APPS
设置中启用他们,然后在模板中使用 {%
load
%}
tag 载入他们.
django.contrib.humanize
一堆 Django 模板过滤器,用于生成易读的数据,参阅 humanize documentation
.