template/htmlを使ってHTML表示を行う時、テンプレートの一部の表示方法を変えたいときがあります。
変えたい部分だけ変えたテンプレートを複数用意する方法もありますが、面倒というか煩雑になるのでパース部分に直接HTMLタグを書いて変更させたい。
そのままやるとタグ部分が文字列になったのでその対策方法メモ。
Execute部分などはgin-gonic/ginを使っているので省略。
ginのパース機能を使ってタグを含んだ内容をHTML表示してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//xxx.html <div>{{.xxx.Title}}</div> <div>{{.xxx.Content}}</div> ... type XXX struct { Title string Content string } ... func SomeMethod(c *gin.Context) { c.HTML(200, "xxx.html", gin.H{ xxx: XXX{"TITLE", "<p>CONTENT</p>"} }) } ... router.GET("/xxx", SomeMethod) |
このような構成で実行してみる。
このとき<p>
タグが文字列としてブラウザに表示されてしまう。
タグを含む部分をtemplate.HTML
に置き換えることで解決しました。
1 2 3 4 5 6 |
import "html/template" type XXX struct { Title string Content template.HTML } |
この中身はstring
なので他の部分を変更する必要はありませんでした。
明示的にstringをtemplate.HTMLに変換するときにはtemplate.HTML()
を使います。
1 2 3 4 5 6 7 8 9 10 |
//OK var tmplHtml template.HTML = "<p>some paragraph</p>" //NG str := "<p>some paragraph</p>" var tmplHtml template.HTML = str //OK str := "<p>some paragraph</p>" var tmplHtml template.HTML = template.HTML(str) |