94

JinjaがPythonランタイムに持っているようなネストされたテンプレートを取得するにはどうすればよいですか?TBCが意味するのは、Jinja / django-templatesのように、ベーステンプレートのブロックをファイリングするだけで、ベーステンプレートから多数のテンプレートを継承する方法です。html/template標準ライブラリだけで使用できますか?

それが不可能な場合、私の選択肢は何ですか。html/template口ひげはオプションのようですが、コンテキスト依存のエスケープなどの素晴らしい微妙な機能を見逃しているでしょうか?他にどのような選択肢がありますか?

(環境:Google App Engin、Go runtime v1、Dev-Mac OSx lion)

読んでくれてありがとう。

4

5 に答える 5

142

はい、可能です。Ahtml.Templateは、実際には一連のテンプレート ファイルです。このセットで定義されたブロックを実行すると、このセットで定義された他のすべてのブロックにアクセスできます。

このようなテンプレート セットのマップを独自に作成すると、基本的には Jinja / Django と同じ柔軟性が得られます。唯一の違いは、html/templateパッケージはファイル システムに直接アクセスできないため、自分でテンプレートを解析して構成する必要があることです。

「base.html」から継承する 2 つの異なるページ (「index.html」と「other.html」) の次の例を検討してください。

// Content of base.html:
{{define "base"}}<html>
  <head>{{template "head" .}}</head>
  <body>{{template "body" .}}</body>
</html>{{end}}

// Content of index.html:
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}

// Content of other.html:
{{define "head"}}<title>other</title>{{end}}
{{define "body"}}other{{end}}

そして、次のテンプレート セットのマップ:

tmpl := make(map[string]*template.Template)
tmpl["index.html"] = template.Must(template.ParseFiles("index.html", "base.html"))
tmpl["other.html"] = template.Must(template.ParseFiles("other.html", "base.html"))

呼び出して「index.html」ページをレンダリングできるようになりました

tmpl["index.html"].Execute("base", data)

呼び出して「other.html」ページをレンダリングできます

tmpl["other.html"].Execute("base", data)

いくつかのトリック (たとえば、テンプレート ファイルの一貫した命名規則) を使用すると、tmplマップを自動的に生成することさえ可能です。

于 2012-07-13T09:53:00.510 に答える
14

ベース テンプレートを実行するときは、値を子テンプレートに渡す必要があります。ここでは単に「.」を渡すだけなので、すべてが渡されます。

テンプレート 1 は {{.}} を表示します

{{define "base"}}
<html>
        <div class="container">
            {{.}}
            {{template "content" .}}
        </div>
    </body>
</html>
{{end}}

テンプレート 2 は、親に渡される {{.domains}} を表示します。

{{define "content"}}
{{.domains}}
{{end}}

{{template "content" .}} の代わりに {{template "content" .}} を使用すると、コンテンツ テンプレートから .domains にアクセスできなくなることに注意してください。

DomainsData := make(map[string]interface{})
    DomainsData["domains"] = domains.Domains
    if err := groupsTemplate.ExecuteTemplate(w, "base", DomainsData); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
于 2016-06-30T01:57:11.970 に答える
5

Django と同様に、テンプレートの継承に {{extends}} および {{block}} タグをサポートする Go テンプレートのスーパーセットであるPongoを使用します。

于 2013-04-02T13:28:38.020 に答える