@serious911

Вложенные шаблоны Golang?

Привет. У меня есть небольшой вопрос по шаблонах в Go. Я создал базовый шаблон HTML страницы layout.html и хочу использовать его как каркас для других страниц (index.html, terms.html), но динамически подставлять другой контент. Как правильно это сделать?

layout.html:
{{ define "layout" }}
<html>
    <body>
       {{ block "content" . }}{{ end }}
    </body>
</html>
{{ end }}

на других страницах я переопределяю блок content так:
index.html:
{{ template "layout" . }}
{{ block "content" . }}
<h1>index</h1>
{{ end }}


terms.html:
{{ template "layout" . }}
{{ block "content" . }}
<h1>terms</h1>
{{ end }}

дальше в роутере генерирую страницу
router := gin.New()
router.LoadHTMLGlob("templates/*")

router.GET("/", func(context *gin.Context) {
	context.HTML(http.StatusOK, "index.html", gin.H{})
})

router.GET("/terms", func(context *gin.Context) {
	context.HTML(http.StatusOK, "terms.html", gin.H{})
})

Проблема в том, что это не работает - на всех страницах отображается один тот же текст из блока content. Роуты работают, layout подгружается, но в шаблонах не подставляется необходимый контент из блока content на разных страницах.

Спасибо
  • Вопрос задан
  • 1403 просмотра
Решения вопроса 1
Резолвинг блоков выполняется в момент парсинга шаблонов, а не в момент их выполнения. У вас всё парсится в один объект, поэтому применяется тот блок, который парсился последним.
Вот здесь один из вариантов, как парсить в разные объекты *Template, чтобы организовать лэйауты.
https://hackernoon.com/golang-template-2-template-...

Но лучше воспользоваться готовыми решениями для gin, например https://github.com/foolin/gin-template
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы