使用标准库可以在Go中嵌套模板吗? (Google App Engine)
我如何获得像Jinja嵌套模板在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
- 设置的默认值。 在'模板'调用。 的父母