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.
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. 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.
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)
}
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.
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
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