Czy możliwe jest zagnieżdżanie szablonów w Go przy użyciu biblioteki standardowej? (Google App Engine)

Jak uzyskać zagnieżdżone szablony, takie jak Jinja w środowisku uruchomieniowym Pythona. TBC chodzi mi o to, jak mam kilka szablonów dziedziczących z szablonów bazowych, po prostu składających się w bloki szablonów bazowych, tak jak robi to Jinja / django-templates. Czy jest to możliwe używając tylko html/template w bibliotece standardowej.

Jeśli nie ma takiej możliwości, to jakie mam alternatywy? Wąsy wydają się być opcją, ale czy wtedy przegapiłbym te miłe subtelne cechy html/template, takie jak wrażliwość kontekstu Ucieczka itp.? Jakie są inne alternatywy? [2]} (Środowisko: Google App Engin, Go runtime v1, Dev - Mac OSx lion) Dzięki za przeczytanie.
Author: tux21b, 2012-07-13

4 answers

Tak, to możliwe. html.Template jest w rzeczywistości zbiorem plików szablonów. Jeśli wykonasz zdefiniowany blok w tym zestawie, ma on dostęp do wszystkich innych bloków zdefiniowanych w tym zestawie.

Jeśli tworzysz mapę takich zestawów szablonów na własną rękę, masz w zasadzie taką samą elastyczność, jaką oferuje Jinja / Django. Jedyną różnicą jest to, że pakiet html/template nie ma bezpośredniego dostępu do systemu plików, więc musisz parsować i komponować szablony samodzielnie.

Rozważmy poniższy przykład z dwoma różnymi stronami ("index.html " i " inne.html"), które obie dziedziczą z "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}}

I następująca Mapa zestawów szablonów:

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"))

Możesz teraz renderować swój " indeks.html " strona wywołująca

tmpl["index.html"].Execute("base", data)

I możesz renderować swoje " inne.html " strona wywołująca

tmpl["other.html"].Execute("base", data)

Dzięki pewnym sztuczkom (np. spójnej konwencji nazewnictwa plików szablonów) możliwe jest nawet automatyczne wygenerowanie tmpl mapy.

 119
Author: tux21b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-24 06:25:06

Uwaga, kiedy wykonujesz szablon bazowy, musisz przekazać wartości do szablonów potomnych, tutaj po prostu przekazuję".", aby wszystko zostało przekazane.

Szablon jeden wyświetla {{.}}

{{define "base"}}
<html>
        <div class="container">
            {{.}}
            {{template "content" .}}
        </div>
    </body>
</html>
{{end}}

Szablon dwa wyświetlacze {{.domeny}} które są przekazywane do rodzica.

{{define "content"}}
{{.domains}}
{{end}}

Uwaga, Jeśli użyliśmy {{szablon "treść".}} zamiast {{template "content".}}, .domeny nie byłyby dostępne z szablonu treści.

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)
    }
 7
Author: robert king,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-30 01:57:11

Użyj Pongo , który jest super-zestawem szablonów Go, który obsługuje tagi {{extends}} i {{block}} do dziedziczenia szablonów, tak jak Django.

 5
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-02 13:28:38

Wracam do tej odpowiedzi od kilku dni, w końcu ugryzłem kulę i napisałem do tego małą warstwę abstrakcyjną / pre procesor. To w zasadzie:

  • dodaje słowo kluczowe 'extends' do szablonów.
  • pozwala na nadpisywanie wywołań 'define' (dlatego możliwe są domyślne wartości dla greggory)
  • pozwala na nie zdefiniowane wywołania 'template', po prostu dają pusty łańcuch
  • Ustawia domyślną wartość . w wywołaniach' template ' do . z rodzic

Https://github.com/daemonl/go_sweetpl

 4
Author: daemonl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-03 07:13:58