如何在go中扩展模板?
How to extend a template in go?
问题是:每个页面的 content
部分有几个 article
,我想在每篇文章下面插入一个 likebar
模板。
所以 base.tmpl
就像:
<html>
<head>
{{template "head.tmpl" .}}
</head>
<body>
{{template "content.tmpl" .}}
</body>
</html>
在 article.tmpl
中我想要 :
{{define "content"}}
<div>article 1
{{template "likebar.tmpl" .}}
</div>
<div>article 2
{{template "likebar.tmpl" .}}
</div>
... //these divs are generated dynamically
{{end}}
如何使用 html/template
实现此目的?
我试图在 base.tmpl
中插入一个 {{template "iconbar" .}}
,然后将 {{template "likebar.tmpl" .}}
嵌套在 {{define "content"
中,但它失败了:
Template File Error: html/template:base.tmpl:122:12: no such template
"likebar.tmpl"
您只能包含/插入 associated templates。
如果有多个模板文件,使用template.ParseFiles()
or template.ParseGlob()
解析所有,结果模板会包含所有模板,已经关联,可以参考彼此。
如果您确实使用上述函数来解析您的模板,那么它找不到 likebar.tmpl
的原因是因为您使用了无效名称(例如缺少文件夹名称)来引用它。
从 string
源解析时,您可以使用 Template.Parse()
方法,该方法还将嵌套模板关联到顶级模板。
查看这 2 个工作示例:
func main() {
t := template.Must(template.New("").Parse(templ1))
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
t2 := template.Must(template.New("").Parse(templ2))
template.Must(t2.Parse(templ2Like))
if err := t2.Execute(os.Stdout, nil); err != nil {
panic(err)
}
}
const templ1 = `Base template #1
And included one: {{template "likebar"}}
{{define "likebar"}}I'm likebar #1.{{end}}
`
const templ2 = `Base template #2
And included one: {{template "likebar"}}
`
const templ2Like = `{{define "likebar"}}I'm likebar #2.{{end}}`
输出(在 Go Playground 上尝试):
Base template #1
And included one: I'm likebar #1.
Base template #2
And included one: I'm likebar #2.
问题是:每个页面的 content
部分有几个 article
,我想在每篇文章下面插入一个 likebar
模板。
所以 base.tmpl
就像:
<html>
<head>
{{template "head.tmpl" .}}
</head>
<body>
{{template "content.tmpl" .}}
</body>
</html>
在 article.tmpl
中我想要 :
{{define "content"}}
<div>article 1
{{template "likebar.tmpl" .}}
</div>
<div>article 2
{{template "likebar.tmpl" .}}
</div>
... //these divs are generated dynamically
{{end}}
如何使用 html/template
实现此目的?
我试图在 base.tmpl
中插入一个 {{template "iconbar" .}}
,然后将 {{template "likebar.tmpl" .}}
嵌套在 {{define "content"
中,但它失败了:
Template File Error: html/template:base.tmpl:122:12: no such template "likebar.tmpl"
您只能包含/插入 associated templates。
如果有多个模板文件,使用template.ParseFiles()
or template.ParseGlob()
解析所有,结果模板会包含所有模板,已经关联,可以参考彼此。
如果您确实使用上述函数来解析您的模板,那么它找不到 likebar.tmpl
的原因是因为您使用了无效名称(例如缺少文件夹名称)来引用它。
从 string
源解析时,您可以使用 Template.Parse()
方法,该方法还将嵌套模板关联到顶级模板。
查看这 2 个工作示例:
func main() {
t := template.Must(template.New("").Parse(templ1))
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
t2 := template.Must(template.New("").Parse(templ2))
template.Must(t2.Parse(templ2Like))
if err := t2.Execute(os.Stdout, nil); err != nil {
panic(err)
}
}
const templ1 = `Base template #1
And included one: {{template "likebar"}}
{{define "likebar"}}I'm likebar #1.{{end}}
`
const templ2 = `Base template #2
And included one: {{template "likebar"}}
`
const templ2Like = `{{define "likebar"}}I'm likebar #2.{{end}}`
输出(在 Go Playground 上尝试):
Base template #1
And included one: I'm likebar #1.
Base template #2
And included one: I'm likebar #2.