我开始编写一个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上找到
router.LoadHTMLGlob
和template.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"}}
操作。