Шаблоны Golang не загружаются - PullRequest
0 голосов
/ 16 марта 2019

Я начал писать приложение Gin, и мое дерево проектов выглядит как

-assets
--css
---{bootstrap}
-templates
--layouts
---footer.html
---head.html
---header.html
--book.html
-main.go

В main.go я загружаю шаблоны, и нет ошибки

router.LoadHTMLGlob("./templates/layouts/*.html")

Я определяю шаблоны

{{ define "head" }}
<head>
    //Head
</head>
 {{ end }}

И я их вкладываю

 {{ define "header" }}
 {{ template "head.html" . }}
 //HTML
 {{ end }}

Но когда я пытаюсь их использовать, я получаю пустой вывод

 {{ template "header" . }}
 <h1>{{ .Title}}</h1>

 <h3>{{ .Author.Fullname}}</h3>

[Редактировать] Функция, которая выполняет шаблон:

func getBook(c *gin.Context) {
//DB stuff
var book models.Book
t, err := template.ParseFiles("templates/book.html")
if err != nil {
    log.Println(err)
}
t.Execute(c.Writer, book)
}

Полный код можно найти на github

1 Ответ

1 голос
/ 16 марта 2019

router.LoadHTMLGlob и template.ParseFiles - это два отдельных подхода к работе с шаблонами. Шаблон, возвращаемый ParseFiles, не знает шаблонов, загруженных LoadHTMLGlob. Как только вы решите использовать LoadHTMLGlob, вы должны использовать c.HTML для рендеринга ваших шаблонов. И аргумент name для этого c.HTML метода будет либо именем, указанным в {{define "name"}} action , либо base name файла шаблона (включая расширение, которое я считаю).

Так что в вашем случае вы, вероятно, должны сделать что-то вроде этого:

c.HTML(http.StatusOK, "book.html", book)

Дополнительные примеры можно найти здесь: https://gin -gonic.com / docs / examples / html-render /

Имейте в виду, что LoadHTMLGlob опирается на template.ParseGlob, что гласит:

При разборе нескольких файлов с одинаковыми именами в разных каталоги, последний из упомянутых будет тем, который приводит.

Это означает, что если вы хотите, чтобы все ваши шаблоны были доступны через c.HTML, вам необходимо убедиться, что они либо имеют уникальные базовые имена , либо должны содержать действие {{ define "name"}}.

...