Golang Gin框架模板继承报错:找不到base模板
解决Gin框架中模板继承找不到"base"模板的问题
问题核心原因
两次调用LoadHTMLGlob会覆盖之前的模板集合,导致布局模板(base.layout.html)和页面模板(home.page.html)不在同一个模板命名空间里,页面模板无法找到名为"base"的模板定义。
解决方案
1. 合并模板加载
用一次LoadHTMLGlob递归加载所有模板文件,确保所有模板被纳入同一个集合:
r.LoadHTMLGlob("templates/**/*.html")
这个匹配模式会加载templates目录下所有子文件夹(包括layouts和pages)中的所有.html文件。
2. 确保模板定义规范
- 布局模板(
templates/layouts/base.layout.html):必须用define声明模板块,并预留内容填充区域:
{{define "base"}} <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>{{.Title}}</title> </head> <body> <header>网站头部</header> <main> {{block "content" .}}{{end}} <!-- 预留内容块 --> </main> <footer>网站底部</footer> </body> </html> {{end}}
- 页面模板(
templates/pages/home.page.html):先继承基础模板,再定义填充内容的块:
{{template "base" .}} <!-- 继承base模板 --> {{define "content"}} <h1>欢迎来到首页</h1> <p>这是首页的自定义内容</p> {{end}}
3. 完整Gin路由示例
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() // 一次性加载所有模板文件 r.LoadHTMLGlob("templates/**/*.html") r.GET("/", func(c *gin.Context) { c.HTML(200, "home.page.html", gin.H{ "Title": "首页", }) }) r.Run(":8080") }
关键注意事项
- 绝对不要拆分调用
LoadHTMLGlob,后一次调用会完全替换前一次加载的模板集合,导致之前的模板丢失。 - 确认模板文件路径和
LoadHTMLGlob的匹配模式一致,避免漏加载模板文件。
内容的提问来源于stack exchange,提问作者Sujan Gainju
相关产品推荐
相关产品推荐

