Passing data to a nested template not working as expected
Asked Answered
S

1

5

I was trying to get a struct passed to a nested template in Go, using html/template and tried to achieve it using both template.ParseFiles and template.ParseGlob, but it is not working as per my expectation because my understanding is not clear.

My template code for the file header.html is

{{define "header"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title> SiteAdmin - {{.User}}</title>
</head>
{{end}} 

and for the file admin.html is

{{template "header"}}
<body>
"User is {{.User}}"
</body>
</html>

I am using the Execute method on the type *Template as

type Admin struct {
    User string
}


data := new(Admin)
data.User = "Guest"
tpl, err := template.ParseGlob("views/templates/admin/*.html")
CheckForErr(err)
err = tpl.Execute(w, data)
CheckForErr(err)

With the above code, I can pass around the struct data to admin.html, and it shows User is Guest in the browser. But if I try to pass it to any of the nested templates, it wouldn't. The title of the page still shows as SiteAdmin - and not SiteAdmin - Guest. The User data from the struct is visible only if I call it as {{.User}} inside the admin.html file, and any reference to it in the nested templates turns out to be not passed. Is this something achievable?

Thank you all.

Schnozzle answered 4/2, 2018 at 20:2 Comment(2)
Probably you need to use {{ template "header" . }} (note the .)Anaclinal
Wow, Thank you @leafbebop it worked. Could you please post it as an answer? I will accept it. On a separate note, was it mentioned in the documentation? I wanted to know where should I have been looking for it.Schnozzle
A
9

You need to use {{ template "header" . }}. As the document in text/template say:

{{template "name" pipeline}}

The template with the specified name is executed with dot set to the value of the pipeline.

In this case, the pipeline you passed into is ., which reffers to the whole data.

It is somehow unconvenient that documents of html/template is mostly in text/template.

Anaclinal answered 4/2, 2018 at 20:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.