2011-07-14 16 views
1

通常、Makoの名前空間を "インポート"すると、defにしかアクセスできないように見えます。Mako名前空間で定義されたアクセス変数

## base.mako 
<% 
    somevar = ["one", "two", "three"] 
%> 

<%def name="foo()">Bar</%def> 

とインポートテンプレート:私のユースケースsomevarfoo

## child.mako 
<%namespace name="base" file="base.mako" /> 

${base.foo()} # works 
${base.somevar} # fails: no soup for you 

が関連しています。インポートテンプレート内からsomevarにアクセスすることもできれば便利です。これを行うベストプラクティスは何ですか?

+0

'getSomeVar()'関数をオプションに追加していませんか? – 9000

+0

@ 9000:通常、 'somevar'はレンダリング時にテンプレート本体に出力される文字列ではなく、関数やdefの引数として使用される任意のpythonオブジェクトになります。この場合、getSomeVar()をどのように記述して呼び出すのですか? – sink

+0

関数fooをインポートできますが、somevarという名前はありません。あなたは 'def getSomeVar():return somevar'をベースで定義し、うまくいけば' somevar'と同じように 'base.getSomeVar()'を使うことができます。 – 9000

答えて

2

ユーザー9000が上記に示唆しているように、私はそれを行う方法を考え出しました。私はそれを投稿しているので、他の人がそれを必要とする場合に備えて文書化されていますが、より専門的知識を持つ誰かがより良い方法でチップ化できることを願っています。

モジュールブロックで定義されている関数に名前空間を使ってアクセスすることはできませんが、<%def>にアクセスできます。あなたには、いくつかのねじれをしなければならないので、デフォルトでは<%def>ブロックは、コンテキストバッファにまっすぐにダンプ:

## base.mako 
<%! 
    somevar = ["one", "two", "three"] 
%> 

<%def name="getSomeVar()"> 
    <% 
    return somevar 
    %> 
</%def> 

その後、別のテンプレートからsomevarの値を取得するためにbaseとアクセス${base.getSomeVar()}としてbase.mako名前空間をインポートします。

3

私は同じ問題を持っていた - その答えは、継承のドキュメントである:

NamespaceオブジェクトのATTRのアクセサはテンプレートで宣言されたモジュールレベルの変数にアクセスすることができます。 self.attrにアクセスすると、<%で宣言されている継承チェーンの通常の属性にアクセスできます。 %>セクション。

base.attr.somevarと思っています。

関連する問題