Возможно ли иметь вложенные шаблоны в Go, используя стандартную библиотеку? (Google App Engine)
Как мне получить вложенные шаблоны, такие как Jinja, в среде выполнения python. TBC я имею в виду, как у меня есть куча шаблонов, наследуемых от базовых шаблонов, просто подающих в блоки базовых шаблонов, таких как Jinja/django-templates. Можно ли использовать только html/template в стандартной библиотеке.
Если это не возможно, каковы мои альтернативы. Усы, кажется, вариант, но я бы тогда упустил эти приятные тонкие черты html/template как контекст чувствительный побег и т. д.? Какие еще существуют альтернативы?
(среда: Google App Engin, Go runtime v1, Dev-Mac OSx lion)
Спасибо за чтение.
4 ответа:
Да, это возможно. А
html.Templateна самом деле, набор файлов-шаблонов. Если вы выполняете определенный блок в этом наборе, он имеет доступ ко всем другим блокам, определенным в этом наборе.если вы создаете карту таких наборов шаблонов самостоятельно, у вас есть в основном та же гибкость, что и Jinja / Django. Разница лишь в том, что html / template пакет не имеет прямого доступа к файловой системе, поэтому вам нужно проанализировать и составить шаблоны на вашем компьютере собственный.
рассмотрим следующий пример с двумя разными страницами ("index.html " и " другое.html"), которые оба наследуют от " base.html":
// Content of base.html: {{define "base"}}<html> <head>{{template "head" .}}</head> <body>{{template "body" .}}</body> </html>{{end}} // Content of index.html: {{define "head"}}<title>index</title>{{end}} {{define "body"}}index{{end}} // Content of other.html: {{define "head"}}<title>other</title>{{end}} {{define "body"}}other{{end}}и следующая карта наборов шаблонов:
tmpl := make(map[string]*template.Template) tmpl["index.html"] = template.Must(template.ParseFiles("index.html", "base.html")) tmpl["other.html"] = template.Must(template.ParseFiles("other.html", "base.html"))теперь вы можете сделать ваш индекс".html " страница по вызову
tmpl["index.html"].Execute("base", data)и вы можете сделать вашу "других.html " страница по вызову
tmpl["other.html"].Execute("base", data)С некоторыми трюками (например, согласованное соглашение об именах ваших файлов шаблонов), это даже возможно чтобы создать
tmplкарта автоматически.
обратите внимание, когда вы выполняете свой базовый шаблон, вы должны передать значения вниз к дочерним шаблонам, здесь я просто передаю ".- чтобы все передавалось по наследству.
шаблон отображает {{.}}
{{define "base"}} <html> <div class="container"> {{.}} {{template "content" .}} </div> </body> </html> {{end}}шаблон два дисплея {{.домены}}, которые передаются в родительский объект.
{{define "content"}} {{.domains}} {{end}}обратите внимание, если мы используем {{шаблон "содержание" .}} вместо {{шаблон "содержание" .}}, .Домены не будут доступны из шаблона содержания.
DomainsData := make(map[string]interface{}) DomainsData["domains"] = domains.Domains if err := groupsTemplate.ExecuteTemplate(w, "base", DomainsData); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) }
использовать Понго, который представляет собой супер-набор шаблонов Go, который поддерживает теги {{extends}} и {{block}} для наследования шаблонов, как и Django.
Я возвращался к этому ответу в течение нескольких дней, наконец, укусил пулю и написал небольшой абстрактный слой / предварительный процессор для этого. Это в основном:
- добавляет ключевое слово "extends"в шаблоны.
- позволяет переопределять вызовы' define ' (таким образом, возможны значения по умолчанию для greggory)
- позволяет не определена "шаблон" вызовы, они просто дают пустую строку
- задает значение по умолчанию . в "шаблон" звонки . из родитель