英文:
Prevent overwriting of blocks with same name in Go html/template
问题
我在使用Go中的模板时遇到了一些困难。
我有一个基础模板(base.tmpl
)和两个子模板(a.tmpl
和b.tmpl
)。
// base.tmpl
{{ define "base" }}
{{ template "header" . }}
{{ template "content" . }}
{{ template "footer" . }}
{{ end }}
// a.tmpl
{{ template "base" . }}
{{ define "content" }}
This is a.tmpl
{{ end }}
// b.tmpl
{{ template "base" . }}
{{ define "content" }}
This is b.tmpl
{{ end }}
当执行a.tmpl
时,b.tmpl
中的内容块被插入。
例如,渲染a.tmpl
会显示以下页面:
This is b.tmpl
我正在解析模板(见下文),并将结果返回并分配给变量x
,以便我可以调用x.ExecuteTemplate(w, "a.tmpl", nil)
。
func parseTemplates() *template.Template {
templ := template.New("")
err := filepath.Walk("./templates", func(path string, info os.FileInfo, err error) error {
if strings.Contains(path, ".tmpl") {
_, err = templ.ParseFiles(path)
if err != nil {
log.Println(err)
}
}
return err
})
if err != nil {
panic(err)
}
return templ
}
我认为这是因为在解析模板时,Go将b.tmpl
的内容块定义保留为最新的。
我想知道是否有一种方法可以在运行时解析所有模板,并且每次执行页面时无需重新解析头部、内容、页脚等,只需调用要执行的模板即可。
英文:
I'm having difficulty in rendering the correct content using templates in Go.
I have a base template (base.tmpl
) and 2 child templates (a.tmpl
and b.tmpl
).
// base.tmpl
{{ define "base" }}
{{ template "header" . }}
{{ template "content" . }}
{{ template "footer" . }}
{{ end }}
// a.tmpl
{{ template "base" . }}
{{ define "content" }}
This is a.tmpl
{{ end }}
// b.tmpl
{{ template "base" . }}
{{ define "content" }}
This is b.tmpl
{{ end }}
When executing a.tmpl
the contents of the content block in b.tmpl
are inserted.
For example, rendering a.tmpl
results in a page displaying:
This is b.tmpl
I am parsing the templates (see below) and returning and assigning the result to a variable x
so I may call x.ExecuteTemplate(w, "a.tmpl", nil)
func parseTemplates() *template.Template {
templ := template.New("")
err := filepath.Walk("./templates", func(path string, info os.FileInfo, err error) error {
if strings.Contains(path, ".tmpl") {
_, err = templ.ParseFiles(path)
if err != nil {
log.Println(err)
}
}
return err
})
if err != nil {
panic(err)
}
return templ
}
I am assuming this is because when parsing the templates, Go keeps b.tmpl
's content block definition as the most recent.
I'm wondering if there's a way where I can parse all templates at run time and simply call the template I want to execute without having to re-parse the header, content, footer etc. each time I execute the page.
答案1
得分: 1
将模板分别解析为a和b。
atmpl, err := template.ParseFiles("base.tmpl", "a.tmpl")
if err != nil { /* 处理错误 */ }
btmpl, err := template.ParseFiles("base.tmpl", "b.tmpl")
if err != nil { /* 处理错误 */ }
英文:
Parse the templates for a and b separately.
atmpl, err := template.ParseFiles("base.tmpl", "a.tmpl")
if err != nil { /* handle error */ }
btmpl, err := template.ParseFiles("base.tmpl", "b.tmpl")
if err != nil { /* handle error */ }
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论