Golang模板将不会加载

问题描述 投票:-1回答:1

我开始编写一个Gin应用程序,我的项目树看起来像

-assets
--css
---{bootstrap}
-templates
--layouts
---footer.html
---head.html
---header.html
--book.html
-main.go

在main.go我加载模板,没有错误

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

我定义模板

{{ define "head" }}
<head>
    //Head
</head>
 {{ end }}

我把它们筑巢了

 {{ define "header" }}
 {{ template "head.html" . }}
 //HTML
 {{ end }}

但是当我尝试使用它们时,我得到空输出

 {{ template "header" . }}
 <h1>{{ .Title}}</h1>

 <h3>{{ .Author.Fullname}}</h3>

[编辑]执行模板的功能:

func getBook(c *gin.Context) {
//DB stuff
var book models.Book
t, err := template.ParseFiles("templates/book.html")
if err != nil {
    log.Println(err)
}
t.Execute(c.Writer, book)
}

完整代码可以在github上找到

go go-templates go-gin
1个回答
1
投票

router.LoadHTMLGlobtemplate.ParseFiles是处理模板的两种不同方法。 ParseFiles返回的模板不了解LoadHTMLGlob加载的模板。一旦你决定使用LoadHTMLGlob,你应该使用c.HTML来渲染你的模板。这个name方法的c.HTML参数可以是{{define "name"}}动作中指定的名称,也可以是模板文件的基本名称(包括我认为的扩展名)。

所以在你的情况下你应该做这样的事情:

c.HTML(http.StatusOK, "book.html", book)

更多例子可以在这里找到:https://gin-gonic.com/docs/examples/html-rendering/

请记住,LoadHTMLGlob依赖于template.ParseGlob,其中指出:

在不同目录中解析具有相同名称的多个文件时,提到的最后一个文件将是结果。

这意味着如果您希望通过c.HTML访问所有模板,则需要确保它们具有唯一的基本名称,或者需要包含{{ define "name"}}操作。

© www.soinside.com 2019 - 2024. All rights reserved.