Chinaunix首页 | 论坛 | 博客
  • 博客访问: 480593
  • 博文数量: 111
  • 博客积分: 2332
  • 博客等级: 大尉
  • 技术积分: 1187
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-29 11:22
文章分类

全部博文(111)

文章存档

2013年(9)

2012年(28)

2011年(17)

2010年(28)

2009年(29)

我的朋友

分类: Python/Ruby

2010-05-16 19:53:57

一般情况下,先到template.loader.render_to_string。
在render_to_string里面,首先创建并初始化了一个Template对象。
在render_to_string的最后一行,是将传进来的变量整合到模板中去。其中t是一个django.template.Template对象。并且调用Tempalte对象的render函数来解析模板。这个函数其实就是调用的Template对象里面的NodeList里面的各个Node来解析模板。
一个Template对象的初始化通过调用Template的init函数,会做许多事情。在Template的init函数里面有compile_string。在compile_string函数里面,首先生成了一个Lexer对象。Lexer类的作用就是将模板拆分成一个个的token。这些token就是模版中的各个tag,模板变量,模板内容和注释。然后在compile_string函数里面,又生成了一个Parser对象。最后调用Parser对象的parser函数将各个token包装成各个node,并返回NodeList对象。
在这里还要在说一下。在创建Parser对象的时候,在init函数里面有两行:for lib in builtins:  self.add_library(lib)。builtins是一个list,里面放着所有自带的template tag和filter。至于为什么tag和filter会放在这里面,是因为在template/__init__.py的最后有add_to_builtins('django.template.defaulttags')       add_to_builtins('django.template.defaultfilters')。将django自带的tag和filter加在了进来,而在解析模板中的{% load %}这个tag的时候又会通过get_library函数,把自定义的相关tag和filter放到Parser对象的filter和tag中去,这样parser.tag和parser.filter里面就是所有要用到的template tag和filter了。
再来说一下add_to_builtins这个函数,这个函数调用get_library来得到模块里面定义的template和filter。因为template tag和filter都是通过register = template.Library()来注册的,他们都是注册在一个名叫register的Library对象里面,所以通过加在特定模块的register这个变量,就可以得到在特定模块里面定义的template tag和filter了。同时因为这样的设计,get_library函数的代码又表明了,在我们自定义template tag和filer的时候,这个Library对象只能命名为register,不能为其他,否则django加载不到这个Library对象。

阅读(1782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~