当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 模版进阶

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:14

明对比,那些引擎承担了 XML 解析器的开销,且往往比 Django 模板渲染引擎要慢上几个数量级。深度变量的查找在到目前为止的例子中,我们通过 context 传递的简单参数值主要是字符串,还有一个 datetime.date 范例。 然而,模板系统能够非常简洁地处理更加复杂的数据结构,例如list、dictionary和自定义的对象。在 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.year1993>>> d.month5>>> d.day2>>> 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 }} 这样的模板变量将会引发TemplateSyntaxErrorPython 列表类型一点提示: Python的列表是从0开始索引。 第一项的索引是0,第二项的是1,依此类推。句点查找规则可概括为: 当模板系统在变量名中遇到点时,按照以下顺序尝试进行查找:字典类型查找 (比如 foo["bar"] )属性查找 (比如 foo.bar )方法调用 (比如 foo.bar() )列表类型索引查找 (比如 foo[bar] )系统使用找到的第一个有效类型。 这是一种短路逻辑。句点查找可以多级深度嵌套。 例如在下面这个例子中 {{person.name.upper}} 会转换成字典类型查找(person['name'] ) 然后是方法调用( upper() ):>>> 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.'方法调用行为方法调用比其他类型的查找略为复杂一点。 以下是一些注意事项:在方法查找过程中,如果某方法抛出一个异常,除非该异常有一个 silent_variable_failure 属性并且值为 True ,否则的话它将被传播。如果异常被传播,模板里的指定变量会被置为空字符串,比如:>>> t = Template("My name is {{ person.first_name }}.")>>> class PersonClass3:... def first_name(self):... raise AssertionError, "foo">>> p = PersonClass3()>>> t.render(Context({"person": p}))Traceback (most recent call last):...AssertionError: foo>>> class SilentAssertionError(AssertionError):... silent_variable_failure = True>>> class PersonClass4:... def first_name(self):... raise SilentAssertionError>>> p = PersonClass4()>>> t.render(Context({"person": p}))u'My name is .'仅在方法无需传入参数时,其调用才有效。 否则,系统将会转移到下一个查找类型(列表索引查找)。显然,有些方法是有副作用的,好的情况下允许模板系统访问它们可能只是干件蠢事,坏的情况下甚至会引发安全漏洞。例如,你的一个 BankAccount 对象有一个 delete() 方法。 如果某个模板中包含了像{{ account.delete }}这样的标签,其中account 又是BankAccount 的一个实例,请注意在这个模板载入时,account对象将被删除。要防止这样的事情发生,必须设置该方法的 alters_data 函数属性:def delete(self): # Delete the accountdelete.alters_data = True模板系统不会执行任何以该方式进行标记的方法。 接上面的例子,如果模板文件里包含了{{ account.delete }} ,对象又具有 delete()方法,而且delete() 有alters_data=True这个属性,那么在模板载入时, delete()方法将不会被执行。 它将静静地错误退出。如何处理无效变量默认情况下,如果一个变量不存在,模板系统会把它展示为空字符串,不做任何事情来表示失败。 例如:>>> from django.template import Template, Context>>> t = Template('Your name is {{ name }}.')>>> t.render(Context())u'Your name is .'>>> t.render(Context({'var': 'hello'}))u'Your name is .'>>> t.render(Context({'NAME': 'hello'}))u'Your name is .'>>> t.render(Context({'Name': 'hello'}))u'Your name is .'系统静悄悄地表示失败,而不是引发一个异常,因为这通常是人为错误造成的。 这种情况下,因为变量名有错误的状况或名称, 所有的查询都会失败。 现实世界中,对于一个web站点来说,如果仅仅因为一个小的模板语法错误而造成无法访问,这是不可接受的。玩一玩上下

上一页  [1] [2] [3] [4] [5] [6] [7]  下一页


Django 模版进阶