使用标准库可以在Go中嵌套模板吗? (Google App Engine)

我如何获得像Jin​​ja嵌套模板在Python运行时。 TBC我的意思是我如何从一个基本模板inheritance一堆模板,只是在基本模板块,如Jinja / Django模板。 是否有可能使用标准库中的html/template

如果这不可能,我有什么select。 小胡子似乎是一个select,但我会错过这些html/template的上下文敏感转义等微妙的function? 还有什么其他的select?

(环境:Google App Engin,Go运行时v1,Dev – Mac OSx狮子)

谢谢阅读。

对的,这是可能的。 html.Template实际上是一组模板文件。 如果你在这个集合中执行一个定义的块,它可以访问在这个集合中定义的所有其他块。

如果您自己创build这样的模板集合的映射,那么Jinja / Django提供的基本上具有相同的灵活性。 唯一的区别是html / template包没有对文件系统的直接访问,所以你必须自己parsing和组合模板。

考虑以下两个不同页面(“index.html”和“other.html”)的例子,它们都从“base.html”inheritance:

 // 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映射。

注意,当你执行你的基本模板时,你必须将值传递给子模板,在这里我只需要传递“。”,这样就可以传递所有的值。

模板一显示{{。}}

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

模板两个显示{{.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) } 

使用Pongo ,就像Django一样,它是Go模板的超集,支持用于模板inheritance的{{extends}}和{{block}}标记。

我已经回到这个答案好几天了,终于find了一点点,并为此写了一个小的抽象层/预处理器。 它基本上:

  • 将“扩展”关键字添加到模板。
  • 允许覆盖“定义”调用(因此greggory的默认值是可能的)
  • 允许未定义的“模板”调用,他们只是给一个空的string
  • 设置的默认值。 在'模板'调用。 的父母

https://github.com/daemonl/go_sweetpl