Возможно ли иметь вложенные шаблоны в 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 77

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)
  • позволяет не определена "шаблон" вызовы, они просто дают пустую строку
  • задает значение по умолчанию . в "шаблон" звонки . из родитель

https://github.com/daemonl/go_sweetpl