如何使用golang html / template的基本模板文件?

时间:2016-04-14 08:44:45

标签: go

有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中使用基本布局吗?

2 个答案:

答案 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",
        })

这需要比我期望的更多的手动设置,但是可以完成工作。