我在Go中使用echo框架来创建一个Web应用程序。我有一个名为templates
的目录,其中有两个目录layouts
和users
。目录树如下:
layouts
|--------default.tmpl
|--------footer.tmpl
|--------header.tmpl
|--------sidebar.tmpl
users
|--------index.tmpl
页眉,页脚和侧边栏的代码类似于:
{{define "header"}}
<!-- some html here -->
{{ end }}
....
default.tmpl
如下:
{{ define "default" }}
{{ template "header" }}
{{ template "sidebar" }}
<div class="content-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<h2 class="page-title">Dashboard</h2>
{{ template "content" .}}
</div>
</div>
</div>
</div>
{{ template "footer" }}
{{ end }}
users\index.tmpl
{{define "index"}}
{{template "default"}}
{{end}}
{{define "content"}}
<p>Hello world</p>
{{end}}
现在,我使用
解析文件t := &Template{}
t.templates = template.Must(template.ParseGlob("views/layouts/*"))
t.templates = template.Must(template.ParseGlob("views/user/*"))
尝试渲染
func User(c echo.Context) error {
return c.Render(http.StatusOK, "index", nil)
}
但我只收到内部服务器错误。我也不知道如何调试模板。如果users\index.tmpl
中不包含其他模板标记,则代码有效。但是当我尝试在其中包含主模板时,错误会返回。我在这里做错了什么?
答案 0 :(得分:1)
管理解决这个问题。这个页面https://elithrar.github.io/article/approximating-html-template-inheritance/有所帮助。 基本上,我不得不将用于解析模板的代码更改为:
tpls, err := filepath.Glob("views/user/*")
if err != nil {
log.Fatal(err)
}
layouts, err := filepath.Glob("views/layouts/*")
if err != nil {
log.Fatal(err)
}
for _, layout := range layouts {
files := append(layouts, tpls)
t.templates = template.Must(template.ParseFiles(files...))
}