一般情况下,先到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对象。
阅读(1777) | 评论(0) | 转发(0) |