Django:Template Inside : Variableクラスは _resolve_lookupでコンテキストを処理する。

context はdictが基本。。
lookupはテンプレート中の変数文字列をセパレータ(.)でスプリットしたリスト。
変数が、"depth0.depth1.depth2" の場合、[‘depth0′,’depth1′,’depth2’]となる。
これをbitでループさせて、ループごとにbitで辞書をルックアップする。
ルックアップした結果をcurrentに入れて最終的にこれを返す。

コンテキストが {’depth0′: xxx } とかオブジェクトになっていると、depth1のルックアップで失敗するので、
xxxからgetattrで、depth1を取得する。
次のbitのdepth2でも同じことがおきて、getattrでdepth2を取得してcurrentにいれるのでそれが帰る。

コンテキストが階層化dictの場合は十書のルックアップだけで終わる。

class Variable(object):
     :
     :
    def _resolve_lookup(self, context):
        """
        Performs resolution of a real variable (i.e. not a literal) against the
        given context.

        As indicated by the method’s name, this method is an implementation
        detail and shouldn’t be called by external code. Use Variable.resolve()
        instead.
        """
        current = context
        for bit in self.lookups:
            try: # dictionary lookup
                current = current[bit]
            except (TypeError, AttributeError, KeyError):
                try: # attribute lookup
                    current = getattr(current, bit)
                    if callable(current):
                        if getattr(current, ‘alters_data’, False):
                            current = settings.TEMPLATE_STRING_IF_INVALID
                        else:
                            try: # method call (assuming no args required)
                                current = current()
                            except TypeError: # arguments *were* required
                                # GOTCHA: This will also catch any TypeError
                                # raised in the function itself.
                                current = settings.TEMPLATE_STRING_IF_INVALID # invalid method call
                            except Exception, e:
                                if getattr(e, ‘silent_variable_failure’, False):
                                    current = settings.TEMPLATE_STRING_IF_INVALID
                                else:
                                    raise
                except (TypeError, AttributeError):
                    try: # list-index lookup
                        current = current[int(bit)]
                    except (IndexError, # list index out of range
                            ValueError, # invalid literal for int()
                            KeyError,   # current is a dict without `int(bit)` key
                            TypeError,  # unsubscriptable object
                            ):
                        raise VariableDoesNotExist("Failed lookup for key [%s] in %r", (bit, current)) # missing attribute
                except Exception, e:
                    if getattr(e, ‘silent_variable_failure’, False):
                        current = settings.TEMPLATE_STRING_IF_INVALID
                    else:
                        raise

        return current

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中