首页 > 解决方案 > 与嵌套 golang html 模板作斗争

问题描述

我仍在为 golang 模板而苦苦挣扎。我可以让他们工作。但不是我需要的方式。

我想有一个大师layout.gohtml,然后解析一个页面模板thispage.gohtml。我希望master是一个完整的布局,带有{{template "title" .}}{{template "content" .}}等。然后页面模板将包含带有{{define ...}}等的变化内容......

如果我在每个请求上解析模板并且没有 FuncMaps,我就可以完成这项工作。但我想解析一次并按名称调用它们。这是我做不到的。我只是得到一个没有错误的空白页。被困在这几天了。

我还想在 FuncMaps 中添加一些自定义函数以进行格式化等。在这种嵌套场景中我无法工作。它适用于更简单的非嵌套场景。

有人可以看看我的代码并告诉我哪里出错了吗?此输出只是空白,调试(在 vscode 中)似乎没有显示任何明显的内容。谢谢...

此代码生成一个空白页面并且没有错误...预期输出是基于模板的渲染页面...并且没有名称的 tmpl.Execute 具有相同的空白结果。

// Show handler
func Show(w http.ResponseWriter, r *http.Request) {
    var page models.Page
    name := mux.Vars(r)["name"]

    switch r.Method {
    case "GET":

        if name != "" {
            page = models.GetPageByName(name)
        } else {
            page = models.GetPageByName("home")
        }

        data := make(map[string]interface{})
        data["Page"] = page

        funcMap := template.FuncMap{
            "toupper": strings.ToUpper,
        }

        var err error
        tmpl := template.New("show").Funcs(funcMap)
        tmpl, err = tmpl.ParseFiles("templates/layout.gohtml", "templates/show.gohtml")
        if err != nil {
            fmt.Println(err)
        }
        // err = tmpl.ExecuteTemplate(w, "show", data)
        err = tmpl.Execute(w, data)
        if err != nil {
            fmt.Println(err)
        }
    }
}

布局.gohtml:

<!doctype html>
<html lang="en">
<head>
    <title>{{block "title" .}}Default Title{{end}}</title>
</head>
<body>
    <nav>...</nav>
    <div class="container">
        {{template "content" .}}
    </div>
</body>
</html>

显示.gohtml:

{{define "title"}}{{.Page.Title}}{{end}}
{{define "content"}} 

    <h1>{{.Page.Title}}</h1>

    {{.Page.Content}}

{{end}}

标签: gotemplates

解决方案


推荐阅读