Django框架中方法的访问和查找
在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。 最好是用几个例子来说明一下。 比如,假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点: >>> 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 几个属性,你同样可以在模板中使用句点来访问这些属性: >>> 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)来访问它的属性,这个方法适用于任意的对象。 >>> 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() 方法,你在模板中可以使用同样的句点语法来调用它们: >>> 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' 注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的方法。 (我们将在本章稍后部分解释该设计观。) 最后,句点也可用于访问列表索引,例如: >>> 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,依此类推。 句点查找规则可概括为: 当模板系统在变量名中遇到点时,按照以下顺序尝试进行查找:
系统使用找到的第一个有效类型。 这是一种短路逻辑。 句点查找可以多级深度嵌套。 例如在下面这个例子中 {{person.name.upper}} 会转换成字典类型查找( person['name'] ) 然后是方法调用( upper() ): >>> from django.template import Template,'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.' (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |