[解決済み] 標準ライブラリを使って、Goでネストしたテンプレートを持つことは可能ですか?
質問
Jinjaがpythonランタイムで持っているようなネストされたテンプレートを得るにはどうしたらよいでしょうか。私が言いたいのは、Jinja/django-templates がそうであるように、たくさんのテンプレートがベーステンプレートを継承し、ベーステンプレートのブロックにファイリングする方法を教えてください、ということです。それは、単に
html/template
を標準ライブラリで使用することは可能でしょうか?
それが可能でない場合、私の代替は何でしょう。Mustache は選択肢の 1 つに見えますが、その場合、html/template
の微妙な機能、例えば文脈依存のエスケープなどを見逃してしまうのでしょうか?他の選択肢は何ですか?
(環境: Google App Engin, Go runtime v1, Dev - Mac OSx lion)
お読みいただきありがとうございます。
どのように解決するのですか?
はい、可能です。A
html.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
マップを自動的に生成することも可能です。
関連
-
[解決済み】YAMLファイルのパースエラー:マッピング値はここでは許可されません。
-
[解決済み] gcloud app deploy` vs. `appcfg.py` [クローズド].
-
[解決済み] HTTP Get with 204 No Content: それは正常ですか?
-
[解決済み] Google App EngineとGoogle Compute Engineの違いは何ですか?
-
[解決済み] コンソールで標準入力から読み込むにはどうすればよいですか?
-
[解決済み] Go言語には関数/メソッドのオーバーロードがありますか?
-
[解決済み] Google Cloud BigtableとGoogle Cloud Datastoreの比較
-
[解決済み] Google App Engine: GqlのLIKEクエリは可能ですか?
-
[解決済み] Google App Engineのアプリケーションを削除する
-
[解決済み] Google Cloud Consoleからプロジェクトを削除する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】YAMLファイルのパースエラー:マッピング値はここでは許可されません。
-
[解決済み] gcloud app deploy` vs. `appcfg.py` [クローズド].
-
[解決済み] HTTP Get with 204 No Content: それは正常ですか?
-
[解決済み] Google App EngineとGoogle Compute Engineの違いは何ですか?
-
[解決済み] Google Cloud BigtableとGoogle Cloud Datastoreの比較
-
[解決済み] Google App Engine: GqlのLIKEクエリは可能ですか?
-
[解決済み] Google App Engineのアプリケーションを削除する
-
[解決済み] Google Cloud Consoleからプロジェクトを削除する方法