0

makoの例とチュートリアルのほとんどは、テンプレートにファイルを使用することを提案しています。

テンプレートが文字列またはデータベースに保存されている場合、継承を使用するにはどうすればよいですか?

出発点として、mako Webサイトのファイルベースの継承例に基づいて変数ベースの継承例を作成しようとしています(後でデータベースベースの例に簡単に変換できます)。

from mako.template import Template

base = """
  <html>
    <body>

      <div class="header">
        <%block name="header"/>
      </div>

      Some body content ...

    </body>
  </html>
"""

index = """
  <%inherit file="base.html"/>

  <%block name="header">
    this is some header content
  </%block>

  this is the body content.
"""

base_template = Template(base)
index_template = Template(index)

print index_template.render()

明らかに、これは機能しません。

2番目のテンプレートには、base.htmlがbase_templateであることを知るための何らかの方法が必要です。

この質問は、2009年のmako-discussグループでも行われました。

https://groups.google.com/d/topic/mako-discuss/QiwkRu7rTFQ/discussion

これはマイケルバイエルが答えとして書いたものです:


テンプレートが相互 にアクセスするには、TemplateLookupコレクションが必要です。

テンプレートに送信される「lookup=some_lookup」キーワード引数を使用するか、lookup.put( "some template name"、 "your template")を使用してルックアップでテンプレート文字列を直接作成することにより、任意のテンプレートをルックアップに関連付けることができます。

これを適用して実際のPythonコードに変換する方法をまだ理解できませんでした。

4

1 に答える 1

2

まず${self.body()}、基本テンプレートに追加する必要があります。これにより、継承者のデータが移動する場所がマークされます。そして、次のように TemplateLookup を使用できます。

from mako.template import Template
from mako.lookup import TemplateLookup

base = """
  <html>
    <body>

      <div class="header">
        <%block name="header"/>
      </div>

      ${self.body()}

    </body>
  </html>
"""

index = """
  <%inherit file="base.html"/>

  <%block name="header">
    this is some header content
  </%block>

  this is the body content.
"""

lookup = TemplateLookup()
lookup.put_string("base.html", base)
lookup.put_string("index.html", index)

index_template = lookup.get_template("index.html")

print index_template.render()
于 2013-02-09T19:59:37.763 に答える