Как расширить шаблон в go?

Вот проблема: есть несколько article в разделе content каждой страницы, и я хотел бы вставить шаблон likebar под каждой статьей.

Итак, base.tmpl выглядит так:

<html>
  <head>    
    {{template "head.tmpl" .}}
  </head>
  <body>    
    {{template "content.tmpl" .}}   
   </body>
</html>

и в article.tmpl я хочу иметь:

    {{define "content"}}    
          <div>article 1 
             {{template "likebar.tmpl" .}} 
          </div> 
          <div>article 2
             {{template "likebar.tmpl" .}} 
         </div>
       ... //these divs are generated dynamically
    {{end}}

Как я могу добиться этого с помощью html/template? Я попытался вставить {{template "iconbar" .}} в base.tmpl, а затем вложил {{template "likebar.tmpl" .}} внутрь {{define "content", но это не удалось:

Ошибка файла шаблона: html/template:base.tmpl:122:12: нет такого шаблона "likebar.tmpl"


person Karlom    schedule 21.11.2016    source источник


Ответы (1)


Вы можете включать/вставлять только связанные шаблоны.

Если у вас несколько файлов шаблонов, используйте template.ParseFiles() или template.ParseGlob(), чтобы проанализировать их все, и шаблон результата уже будет иметь все шаблоны связаны, поэтому они могут ссылаться друг на друга.

Если вы используете вышеуказанные функции для анализа ваших шаблонов, то причина, по которой он не может найти likebar.tmpl, заключается в том, что вы ссылаетесь на него по недопустимому имени (например, отсутствующему имени папки).

При синтаксическом анализе из string источника вы можете использовать метод Template.Parse(), который также связывает вложенные шаблоны с шаблоном верхнего уровня.

Посмотрите эти 2 рабочих примера:

func main() {
    t := template.Must(template.New("").Parse(templ1))
    if err := t.Execute(os.Stdout, nil); err != nil {
        panic(err)
    }

    t2 := template.Must(template.New("").Parse(templ2))
    template.Must(t2.Parse(templ2Like))
    if err := t2.Execute(os.Stdout, nil); err != nil {
        panic(err)
    }
}

const templ1 = `Base template #1
And included one: {{template "likebar"}}
{{define "likebar"}}I'm likebar #1.{{end}}
`

const templ2 = `Base template #2
And included one: {{template "likebar"}}
`

const templ2Like = `{{define "likebar"}}I'm likebar #2.{{end}}`

Вывод (попробуйте на Go Playground):

Base template #1
And included one: I'm likebar #1.

Base template #2
And included one: I'm likebar #2.
person icza    schedule 21.11.2016