有gin-gonic网络应用程序。
有3个文件:
1)base.html - 基本布局文件
<!DOCTYPE html>
<html lang="en">
<body>
header...
{{template "content" .}}
footer...
</body>
</html>
2)page1.html,for / page1
{{define "content"}}
<div>
<h1>Page1</h1>
</div>
{{end}}
{{template "base.html"}}
3)page2.html,/ page2
{{define "content"}}
<div>
<h1>Page2</h1>
</div>
{{end}}
{{template "base.html"}}
问题是/ page1和/ page2使用一个模板 - page2.html。我认为我对这种结构有误解:{{define "content"}}
,{{template "base.html"}}
。
请问,您能举例说明如何在golang中使用基本布局吗?
答案 0 :(得分:9)
只要您将模板与&#34;内容&#34;一起解析,就可以使用base.html,如下所示:
base.html文件
{{define "base"}}
<!DOCTYPE html>
<html lang="en">
<body>
header...
{{template "content" .}}
footer...
</body>
</html>
{{end}}
page1.html
{{define "content"}}
I'm page 1
{{end}}
page2.html
{{define "content"}}
I'm page 2
{{end}}
然后 ParseFiles 与(&#34; your-page.html&#34;,&#34; base.html&#34;)和 ExecuteTemplate 与您的上下文。
tmpl, err := template.New("").ParseFiles("page1.html", "base.html")
// check your err
err = tmpl.ExecuteTemplate(w, "base", yourContext)
答案 1 :(得分:0)
据我了解,当您使用ParseGlob()
时,Gin会解析所有匹配的文件并从中创建一个模板对象。为了完成您想做的事情,您需要两个不同的模板(一个用于第1页,另一个用于第2页)。
Gin documentation说这是一个已知的局限性,并指出了克服之道:
默认情况下,杜松子酒允许只使用一个html.Template。选中a multitemplate render以使用诸如go 1.6
block template
之类的功能。
使用多模板库,您可以编写如下内容:
render := multitemplate.NewRenderer()
render.AddFromFiles("page1", "templates/base.html", "templates/page1.html")
render.AddFromFiles("page2", "templates/base.html", "templates/page2.html")
router := gin.Default()
router.HTMLRender = render
// Later
ginContext.HTML(200, "page1", gin.H{
"title": "The Wonderful Page One",
})
这需要比我期望的更多的手动设置,但是可以完成工作。