模板部分呈现为纯文本
Template partially rendering as plaintext
我在尝试通过 Go html 模板处理一件特定的事情时遇到了问题。
(为简洁起见,全部为 condensed/simplified)
我有一个base
模板:
<html>
<head>
<title>{{ .Title }}</title>
</head>
<body>
{{ template .PageBody . }}
</body>
</html>
还有一个device
模板:
{{ define "device" }}
<div class="nav">
<div class="links">
{{ .DeviceLinkList }}
</div>
</div>
<div class="textData">
<div class="deviceNick">
{{ .Nickname }}
</div>
</div>
{{ end }}
我的设置方式是这样的:
在 main.go
文件中:
package main
import "html/template" //among others, of course.
var err error
var tmplInit *template.Template
type TemplVals struct{
Title string
Version string
Release string
PageBody string
}
var templVals TemplVals
func init(){
// Prepare GOHTML templates
tmplInit, err = template.ParseGlob("./html_templates/*.gohtml")
if err != nil { log.Panic("Cant load templates! ", err) }
templVals.Version = serverDetails["version"]
templVals.Release = serverDetails["release"]
}
//Main only has MUX routing using Gorilla Mux
在 deviceController.go
文件中:
type DeviceValues struct{
DeviceLinkList string
Nickname string
Title string
}
func home(w http.ResponseWriter, r *http.Request){
w.Header().Set("Content-Type", "text/html; charset=utf-8")
var deviceData DeviceValues
// Seems to not be loaded as HTML when passed to template?
deviceData.DeviceLinkList = loadDeviceList("example")
deviceData.Nickname = loadDeviceData("example")
deviceData.PageBody = "device"
deviceData.Title = "Home"
tmplErr := tmplInit.Execute(w, deviceData)
if tmplErr != nil{ log.Panic(tmplErr) }
}
func loadDeviceList(user string)(string){
var deviceid, linkList string
linkList = `<ul>`
for getIDs.Next(){
err = getIDs.Scan(&deviceid) // SQL gathers this
if err != nil { panic(err) }
linkList = linkList + `<li><a href="#" onclick="loadDevice('`+deviceid+`')">`+deviceid+`</a></li>`
}
linkList = linkList + `</ul>`
return linkList
}
func loadDeviceData(user string)(string){
//SQL retrieves data for devices associated to passed in user
//for brevity:
return "Example Nickname"
}
问题是昵称加载正确,电池电量和传感器读数等其他字段都正确通过,甚至可以在 JS 函数中使用,但是 DeviceLinkList 无论如何都以常规字符串呈现我所做的。这不是列表,只是按原样以纯文本形式吐出 HTML。
解决方案比我想象的要简单得多。
我没有使用正确的措辞来找到这个 SO 答案,但它完美地解决了这个问题:Go template.ExecuteTemplate include html
要点是我需要将 DeviceLinkList
类型设为 template.HTML
而不是字符串,当我为其赋值时,它需要是 deviceData.DeviceLinkList = template.HTML("<ul><li>list1</li><li>list2</li></ul>")
我在尝试通过 Go html 模板处理一件特定的事情时遇到了问题。
(为简洁起见,全部为 condensed/simplified)
我有一个base
模板:
<html>
<head>
<title>{{ .Title }}</title>
</head>
<body>
{{ template .PageBody . }}
</body>
</html>
还有一个device
模板:
{{ define "device" }}
<div class="nav">
<div class="links">
{{ .DeviceLinkList }}
</div>
</div>
<div class="textData">
<div class="deviceNick">
{{ .Nickname }}
</div>
</div>
{{ end }}
我的设置方式是这样的:
在 main.go
文件中:
package main
import "html/template" //among others, of course.
var err error
var tmplInit *template.Template
type TemplVals struct{
Title string
Version string
Release string
PageBody string
}
var templVals TemplVals
func init(){
// Prepare GOHTML templates
tmplInit, err = template.ParseGlob("./html_templates/*.gohtml")
if err != nil { log.Panic("Cant load templates! ", err) }
templVals.Version = serverDetails["version"]
templVals.Release = serverDetails["release"]
}
//Main only has MUX routing using Gorilla Mux
在 deviceController.go
文件中:
type DeviceValues struct{
DeviceLinkList string
Nickname string
Title string
}
func home(w http.ResponseWriter, r *http.Request){
w.Header().Set("Content-Type", "text/html; charset=utf-8")
var deviceData DeviceValues
// Seems to not be loaded as HTML when passed to template?
deviceData.DeviceLinkList = loadDeviceList("example")
deviceData.Nickname = loadDeviceData("example")
deviceData.PageBody = "device"
deviceData.Title = "Home"
tmplErr := tmplInit.Execute(w, deviceData)
if tmplErr != nil{ log.Panic(tmplErr) }
}
func loadDeviceList(user string)(string){
var deviceid, linkList string
linkList = `<ul>`
for getIDs.Next(){
err = getIDs.Scan(&deviceid) // SQL gathers this
if err != nil { panic(err) }
linkList = linkList + `<li><a href="#" onclick="loadDevice('`+deviceid+`')">`+deviceid+`</a></li>`
}
linkList = linkList + `</ul>`
return linkList
}
func loadDeviceData(user string)(string){
//SQL retrieves data for devices associated to passed in user
//for brevity:
return "Example Nickname"
}
问题是昵称加载正确,电池电量和传感器读数等其他字段都正确通过,甚至可以在 JS 函数中使用,但是 DeviceLinkList 无论如何都以常规字符串呈现我所做的。这不是列表,只是按原样以纯文本形式吐出 HTML。
解决方案比我想象的要简单得多。 我没有使用正确的措辞来找到这个 SO 答案,但它完美地解决了这个问题:Go template.ExecuteTemplate include html
要点是我需要将 DeviceLinkList
类型设为 template.HTML
而不是字符串,当我为其赋值时,它需要是 deviceData.DeviceLinkList = template.HTML("<ul><li>list1</li><li>list2</li></ul>")