2

通常、Makoで名前空間を「インポート」すると、defへのアクセスのみが許可されるように見えます。

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

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

そしてインポートテンプレート:

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

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

私のユースケース ではsomevar、とfooは関連しています。somevarインポートするテンプレート内からもアクセスできると便利です。これを行うためのベストプラクティスは何ですか?

4

2 に答える 2

4

私は同じ問題を抱えていました-答えは継承に関するドキュメントにあります:

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

そうしてほしいbase.attr.somevarと思います。

于 2011-12-06T11:12:14.040 に答える
2

ユーザー 9000 が上で提案したように、私はそれを行う 1 つの方法を考え出しました。私はそれを投稿しているので、他の誰かがそれを必要とする場合に備えて文書化されていますが、より多くの専門知識を持つ誰かがより良い方法で参加できることを願っています.

私が知る限り、名前空間を介してモジュール ブロックで定義された関数にアクセスすることはできませんが、<%def>. デフォルトで<%def>は、ブロックはコンテキスト バッファに直接ダンプされるため、いくつかのゆがみを行う必要があります。

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

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

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

于 2011-07-15T01:15:00.967 に答える