在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。
最好是用几个例子来说明一下。 比如,假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点:
1
2
3
4
5
6
|
>>> from django.template import Template, Context
>>> person = { 'name' : 'Sally' , 'age' : '43' }
>>> t = Template( '{{ person.name }} is {{ person.age }} years old.' )
>>> c = Context({ 'person' : person})
>>> t.render(c)
u 'Sally is 43 years old.'
|
同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有 year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date( 1993 , 5 , 2 )
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template( 'The month is {{ date.month }} and the year is {{ date.year }}.' )
>>> c = Context({ 'date' : d})
>>> t.render(c)
u 'The month is 5 and the year is 1993.'
|
这个例子使用了一个自定义的类,演示了通过实例变量加一点(dots)来访问它的属性,这个方法适用于任意的对象。
1
2
3
4
5
6
7
8
|
>>> from django.template import Template, Context
>>> class Person( object ):
... def __init__( self , first_name, last_name):
... self .first_name, self .last_name = first_name, last_name
>>> t = Template( 'Hello, {{ person.first_name }} {{ person.last_name }}.' )
>>> c = Context({ 'person' : Person( 'John' , 'Smith' )})
>>> t.render(c)
u 'Hello, John Smith.'
|
点语法也可以用来引用对象的* 方法*。 例如,每个 Python 字符串都有 upper() 和 isdigit() 方法,你在模板中可以使用同样的句点语法来调用它们:
1
2
3
4
5
6
|
>>> from django.template import Template, Context
>>> t = Template( '{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}' )
>>> t.render(Context({ 'var' : 'hello' }))
u 'hello -- HELLO -- False'
>>> t.render(Context({ 'var' : '123' }))
u '123 -- 123 -- True'
|
注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的方法。 (我们将在本章稍后部分解释该设计观。)
最后,句点也可用于访问列表索引,例如:
1
2
3
4
5
|
>>> from django.template import Template, Context
>>> t = Template( 'Item 2 is {{ items.2 }}.' )
>>> c = Context({ 'items' : [ 'apples' , 'bananas' , 'carrots' ]})
>>> t.render(c)
u 'Item 2 is carrots.'
|
不允许使用负数列表索引。 像 {{ items.-1 }} 这样的模板变量将会引发`` TemplateSyntaxError``
Python 列表类型
一点提示: Python的列表是从0开始索引。 第一项的索引是0,第二项的是1,依此类推。
句点查找规则可概括为: 当模板系统在变量名中遇到点时,按照以下顺序尝试进行查找:
- 字典类型查找 (比如 foo["bar"] )
- 属性查找 (比如 foo.bar )
- 方法调用 (比如 foo.bar() )
- 列表类型索引查找 (比如 foo[bar] )
系统使用找到的第一个有效类型。 这是一种短路逻辑。
句点查找可以多级深度嵌套。 例如在下面这个例子中 {{person.name.upper}} 会转换成字典类型查找( person['name'] ) 然后是方法调用( upper() ):
1
2
3
4
5
6
|
>>> from django.template import Template, Context
>>> person = { 'name' : 'Sally' , 'age' : '43' }
>>> t = Template( '{{ person.name.upper }} is {{ person.age }} years old.' )
>>> c = Context({ 'person' : person})
>>> t.render(c)
u 'SALLY is 43 years old.'
|