我正在尝试html/template在 Go 中使用嵌入模板。我非常喜欢无逻辑模板设计,我相信它能够按预期安全地转义(有时其他模板库会出错)。但是,我在尝试实现一个小助手以根据“最终”模板名称在我的 HTTP 处理程序中呈现我的模板时遇到了一些问题。我的 base.tmpl 在我的所有页面中都是有效的“标准”,如果不是,我可以{{ template checkoutJS }}在 base.tmpl 中设置并通过设置添加一些每页 JS {{ define checkoutJS }}https://path.to/extra.js {{ end }}。我希望能够renderTemplate(w, "template_name.tmpl", data)在我的 HTTP 处理程序中说,data包含字符串或结构的 map[string]interface{}在哪里,我想填写任何内容。这是到目前为止的代码:基础文件{{ define "base" }}<!DOCTYPE html><html><head><title>{{ template "title" . }}</title></head><body><div id="sidebar">...</div>{{ template "content" }}<div id="footer">...</div></body></html>create_listing.tmpl{{ define "title" }}Create a New Listing{{ end }}{{ define "content" }}<form> ...</form>{{ end }}login_form.tmpl{{ define "title" }}Login{{ end }}{{ define "content" }}<form> ...</form>{{ end }}
2 回答
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
你不能用当前的 go 模板包做你想做的事。模板没有继承,因此没有模板中的命名块。与定义基本模板不同,定义页眉和页脚模板更为常见。然后,在您的页面模板中,明确包含您希望它们去的地方。
我相信,另一种解决方案是使用 2 阶段模板阶段。第一种方法是为基本模板的所有块编译模板。这些被添加到地图中,然后发送到基础模板以供包含。
交互式爱情
TA贡献1712条经验 获得超3个赞
这很不明显,我不知道他们为什么这样做
ParseGlob 返回一个您丢弃的值,但您需要保留它;它是您需要调用的模板对象,因此您的代码应如下所示:
func init() {
fmt.Println("Starting up.")
t, err := template.ParseGlob("templates/*.tmpl")
if err != nil {
log.Fatal("Error loading templates:" + err.Error())
}
}
该方法的文档(与上面使用的库函数相反)有点不清楚,因为它说它将模板与调用该方法的模板对象相关联,但它也返回一个指向模板对象的指针,如果它像宣传的那样工作,则不需要这样做。乐趣!
- 2 回答
- 0 关注
- 391 浏览
添加回答
举报
0/150
提交
取消