无法从 html/template Golang 访问数据
Can't access data from html/template Golang
我有三个串联的模板。 base.html
、menu.html
、users.html
。但是当我执行这些模板时,我只能从 base.html
.
访问上下文数据
这是我的处理程序:
func HandlerUser(res http.ResponseWriter, req *http.Request){
if req.Method == "GET" {
context := Context{Title: "Users"}
users,err:= GetUser(0)
context.Data=map[string]interface{}{
"users": users,
}
fmt.Println(context.Data)
t,err := template.ParseFiles("public/base.html")
t,err = t.ParseFiles("public/menu.html")
t,err = t.ParseFiles("public/users.html")
err = t.Execute(res,context)
fmt.Println(err)
}
}
这就是我要在用户模板中显示的内容
{{ range $user := index .Data "users" }}
<tr id="user-{{ .Id }}">
<td id="cellId" >{{ $user.Id }}</td>
<td id="cellUserName" >{{ $user.UserName }}</td>
</tr>
{{ end }}
注意:我可以访问 base.html
模板中使用的 "{{.Title}}"
。
首先,您应该检查 Template.ParseFiles()
方法返回的错误。你存储返回的错误,但你只在最后检查它(到那时它被覆盖了 3 次)。
接下来,永远不要在请求处理程序中解析模板,这太耗时又浪费资源。在启动时执行一次(或在第一次请求时)。有关详细信息,请参阅 It takes too much time when using "template" package to generate a dynamic web page to client in golang。
接下来可以一次解析多个文件,传给Template.ParseFiles()
函数时枚举所有就行了(有方法也有函数)
知道 Template.Execute()
only executes a single (named) template. You have 3 associated templates, but only the "base.html"
template is executed by your code. To execute a specific, named template, use Template.ExecuteTemplate()
. For details, see Telling Golang which template to execute first.
首先,您应该定义模板的 结构 ,确定哪些模板包含其他模板,然后执行 "wrapper" 模板(使用 Template.ExecuteTemplate()
)。当您执行调用/包含另一个模板的模板时,您可以告诉您将什么值(数据)传递给它的执行。当您写 {{template "something" .}}
时,这意味着您要将点当前指向的值传递给名为 "something"
的模板的执行。阅读更多相关信息:.
要了解有关模板关联和内部结构的更多信息,请阅读此答案:。
所以在你的情况下,我认为 "base.html"
是包装器,外部模板,其中包括 "menu.html"
和 "users.html"
。所以 "base.html"
应该包含类似这样的行:
{{template "menu.html" .}}
{{template "users.html" .}}
以上几行将调用并包含上述模板的结果,将数据传递给传递给 "base.html"
的执行(如果点未更改)。
使用 template.ParseFiles()
函数 (不是方法)解析文件,如下所示:
var t *template.Template
func init() {
var err error
t, err = template.ParseFiles(
"public/base.html", "public/menu.html", "public/users.html")
if err != nil {
panic(err) // handle error
}
}
然后在你的处理程序中像这样执行它:
err := t.ExecuteTemplate(w, "base.html", context)
我有三个串联的模板。 base.html
、menu.html
、users.html
。但是当我执行这些模板时,我只能从 base.html
.
这是我的处理程序:
func HandlerUser(res http.ResponseWriter, req *http.Request){
if req.Method == "GET" {
context := Context{Title: "Users"}
users,err:= GetUser(0)
context.Data=map[string]interface{}{
"users": users,
}
fmt.Println(context.Data)
t,err := template.ParseFiles("public/base.html")
t,err = t.ParseFiles("public/menu.html")
t,err = t.ParseFiles("public/users.html")
err = t.Execute(res,context)
fmt.Println(err)
}
}
这就是我要在用户模板中显示的内容
{{ range $user := index .Data "users" }}
<tr id="user-{{ .Id }}">
<td id="cellId" >{{ $user.Id }}</td>
<td id="cellUserName" >{{ $user.UserName }}</td>
</tr>
{{ end }}
注意:我可以访问 base.html
模板中使用的 "{{.Title}}"
。
首先,您应该检查 Template.ParseFiles()
方法返回的错误。你存储返回的错误,但你只在最后检查它(到那时它被覆盖了 3 次)。
接下来,永远不要在请求处理程序中解析模板,这太耗时又浪费资源。在启动时执行一次(或在第一次请求时)。有关详细信息,请参阅 It takes too much time when using "template" package to generate a dynamic web page to client in golang。
接下来可以一次解析多个文件,传给Template.ParseFiles()
函数时枚举所有就行了(有方法也有函数)
知道 Template.Execute()
only executes a single (named) template. You have 3 associated templates, but only the "base.html"
template is executed by your code. To execute a specific, named template, use Template.ExecuteTemplate()
. For details, see Telling Golang which template to execute first.
首先,您应该定义模板的 结构 ,确定哪些模板包含其他模板,然后执行 "wrapper" 模板(使用 Template.ExecuteTemplate()
)。当您执行调用/包含另一个模板的模板时,您可以告诉您将什么值(数据)传递给它的执行。当您写 {{template "something" .}}
时,这意味着您要将点当前指向的值传递给名为 "something"
的模板的执行。阅读更多相关信息:
要了解有关模板关联和内部结构的更多信息,请阅读此答案:
所以在你的情况下,我认为 "base.html"
是包装器,外部模板,其中包括 "menu.html"
和 "users.html"
。所以 "base.html"
应该包含类似这样的行:
{{template "menu.html" .}}
{{template "users.html" .}}
以上几行将调用并包含上述模板的结果,将数据传递给传递给 "base.html"
的执行(如果点未更改)。
使用 template.ParseFiles()
函数 (不是方法)解析文件,如下所示:
var t *template.Template
func init() {
var err error
t, err = template.ParseFiles(
"public/base.html", "public/menu.html", "public/users.html")
if err != nil {
panic(err) // handle error
}
}
然后在你的处理程序中像这样执行它:
err := t.ExecuteTemplate(w, "base.html", context)