Go 戈朗模板赢得';t载荷
我开始编写一个Gin应用程序,我的项目树如下Go 戈朗模板赢得';t载荷,go,go-templates,go-gin,Go,Go Templates,Go Gin,我开始编写一个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>
-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 }}
但当我尝试使用它们时,我得到的是空输出
{{ template "header" . }}
<h1>{{ .Title}}</h1>
<h3>{{ .Author.Fullname}}</h3>
完整的代码可以在路由器上找到。LoadHTMLGlob和template是处理模板的两种不同方法。
ParseFiles
返回的模板不知道LoadHTMLGlob
加载的模板。一旦决定使用LoadHTMLGlob
,就应该使用来呈现模板。这个方法的name
参数可以是{{define“name”}
操作中指定的名称,也可以是模板文件的基本名称(包括我相信的扩展名)
因此,在您的情况下,您可能应该这样做:
c.HTML(http.StatusOK, "book.html", book)
更多示例可在此处找到:
请记住,这取决于哪些状态:
分析多个同名文件时,请使用不同的
目录,最后一个提到的将是一个结果
这意味着,如果您想通过
c.HTML
访问所有模板,您需要确保它们要么具有唯一的基名称,要么需要包含{define“name}}
操作。从“一切都简单工作”的默认模板系统移动到Gin有点混乱,即,在使用文件作为模板时,似乎存在一些命名限制。我不知道情况是否如此,但在我的设置中,我必须确保:
- 模板的名称(定义关键字)需要是文件名-至少当这是模板中唯一的定义时(我没有测试过多个定义)-也就是说,如果你使用
作为模板,你需要有/templates/book.html
位于该文件顶部(对于其他模板中包含的模板也是如此;我没有尝试使用{define“book.html”}
或其他更深奥的方法将模板组合在一起)块
- 类似地,在调用
时,必须输入包含该模板的文件的全名(如图所示!)c.HTML(http.StatusOK,“book.HTML”,book)
define
和c.HTML()
调用相匹配,才停止了获取空白页面
此外,在从控制台运行时(在调试模式下),很明显我的程序“查找”的模板远远超过了它应该找到的数量——即,几乎每个模板都是重复的(一个副本用于文件名,另一个副本用于定义
等)。这不仅让我感到困惑,也让应用程序本身感到困惑……什么叫“我一无所获”?没有错误?空输出?请务必包括您如何尝试执行模板。目标是。您没有检查t.Execute()
返回的错误。请这样做。
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)
}
c.HTML(http.StatusOK, "book.html", book)