Golang中的模板继承

kokeuurv  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(119)

我正在尝试在Golang中将模板继承到我的**主页 * 文件中
我的目录结构:

project_root
  /templates
    /layouts
        base.layout.html
    /pages
        home.page.html

Gin路由器配置:

router.LoadHTMLGlob("./templates/layouts/*.layout.html")
router.LoadHTMLGlob("./templates/pages/*.page.html")

templates/layouts/base.layout.html文件:

{{define "base"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{.Title}}</title>
</head>
<body>
    {{block "content" .}} {{end}}
</body>
</html>
{{end}}

templates/pages/ho,e.page.html文件:

{{template "base" .}}

{{define "page-title"}}
    Home
{{end}}
{{end}}

我得到的错误:
错误#01:html/template:home.page.html:1:11:没有这样的模板“基地”

  • 注意:如果我删除了继承,主页加载 * 正常。
cxfofazt

cxfofazt1#

TL;DR

不要对LoadHTMLGlob进行两个不同的调用,而是用途:

router.LoadHTMLGlob("./templates/**/*.html")

说明

这里的问题是由于对LoadHTMLGlob的第二次调用完全覆盖了第一次调用加载的内容。这是因为:

  • LoadHTMLGlob调用engine.SetHTMLTemplate(templ):https://github.com/gin-gonic/gin/blob/v1.9.1/gin.go#L263
  • SetHTMLTemplate分配engine.HTMLRender:https://github.com/gin-gonic/gin/blob/v1.9.1/gin.go#L284

因此,在代码中对LoadHTMLGlob的两次调用结束时,engine.HTMLRender的内容与只调用LoadHTMLGlob("./templates/pages/*.page.html")的内容相同。所以base不存在是正常的,因为它是在./templates/layouts/*.layout.html中定义的。
这就是为什么你应该只对LoadHTMLGlob进行一次调用。

关于您的模板

另外,我不知道你想在这里实现什么,但是在home.page.html中定义的page-titlebase.layout.html中没有使用,而是使用了.Title。如果你的Go代码是:

router.GET("/", func(c *gin.Context) {
    c.HTML(http.StatusOK, "home.page.html", gin.H{})
})

然后,您可以在布局中使用page-title(而不是.Title):

-    <title>{{.Title}}</title>
+    <title>{{block "page-title" .}} {{end}}</title>

并在您的主页中这样定义它:

{{template "base" .}}

{{define "page-title"}}
    Home
{{end}}

{{define "content"}}
    Welcome to my website!
{{end}}

当访问/时,您将获得一个标题为Home的网页,正文内容等于Welcome to my website!

相关问题