Django : Template Inside ( first lookup )

ノードリストをたどってそれぞれをrender() する。

( django/template/__init__.py とか )

class Template(object):
      :
      :
    def render(self, context):
        "Display stage — can be called many times"
        return self.nodelist.render(context)

ノードリストは __init__で compile_string() される。

    def __init__(self, template_string, origin=None, name='<Unknown Template>’):
     :
     :
        self.nodelist = compile_string(template_string, origin)

Lexerがトークン化したトークンをパースしてリストをnodelistが返される。

def compile_string(template_string, origin):
    "Compiles template_string into NodeList ready for rendering"
    if settings.TEMPLATE_DEBUG:
        from debug import DebugLexer, DebugParser
        lexer_class, parser_class = DebugLexer, DebugParser
    else:
        lexer_class, parser_class = Lexer, Parser
    lexer = lexer_class(template_string, origin)
    parser = parser_class(lexer.tokenize())
    return parser.parse()

create_nodelist()でNodeListオブジェクトが返されるので、parseの過程でNodeのサブクラスを順次リストに追加していく。

class Parser(object):

    def parse(self, parse_until=None):
       :
        nodelist = self.create_nodelist()
       :
       :

    def create_nodelist(self):
        return NodeList()

Nodeのサブクラス達

(op)hdknr@debuniid:~/.virtualenvs/op/lib/python2.5/site-packages/django/template$ grep "(Node)" *
__init__.py:class TextNode(Node):
__init__.py:class VariableNode(Node):
__init__.py:        class SimpleNode(Node):
__init__.py:            class InclusionNode(Node):
defaulttags.py:class AutoEscapeControlNode(Node):
defaulttags.py:class CommentNode(Node):
defaulttags.py:class CycleNode(Node):
defaulttags.py:class DebugNode(Node):
defaulttags.py:class FilterNode(Node):
defaulttags.py:class FirstOfNode(Node):
defaulttags.py:class ForNode(Node):
defaulttags.py:class IfChangedNode(Node):
defaulttags.py:class IfEqualNode(Node):
defaulttags.py:class IfNode(Node):
defaulttags.py:class RegroupNode(Node):
defaulttags.py:class SsiNode(Node):
defaulttags.py:class LoadNode(Node):
defaulttags.py:class NowNode(Node):
defaulttags.py:class SpacelessNode(Node):
defaulttags.py:class TemplateTagNode(Node):
defaulttags.py:class URLNode(Node):
defaulttags.py:class WidthRatioNode(Node):
defaulttags.py:class WithNode(Node):
loader_tags.py:class BlockNode(Node):
loader_tags.py:class ExtendsNode(Node):
loader_tags.py:class ConstantIncludeNode(Node):
loader_tags.py:class IncludeNode(Node):

Variableクラスでコンテキストを評価する。コンテキストは、クラスあるいは階層化されたdict、の階層化dict(?)。

(rp)hdknr@debuniid:~/.virtualenvs/rp/src/djopenid$ python
Python 2.5.4 (r254:67916, Sep 26 2009, 08:19:36)
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from django import template
>>> class Hoge:
…    name = ‘hogehoge’

>>> Hoge().name
‘hogehoge’
>> template.Variable(‘hoge.name’).resolve( {’hoge’:Hoge() } )
‘hogehoge’
>>> template.Variable(‘user.name’).resolve(  { ‘user’: { ‘name’: ‘hdknr’,’email’:’xxxxxx@hdknr.com’}})
‘hdknr’
>>> template.Variable(‘user.email’).resolve(  { ‘user’: { ‘name’: ‘hdknr’,’email’:’xxxxxx@hdknr.com’}})
‘xxxxxx@hdknr.com’
>>> template.Variable(‘user.name.first’).resolve( {’user’:{’name’ : { ‘first’: ‘hdknr’,’last’:’com’,},},})
‘hdknr’
>>> template.Variable(‘user.name.last’).resolve( {’user’:{’name’ : { ‘first’: ‘hdknr’,’last’:’com’,},},})
‘com’

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中