91 votes

Est-il possible d'avoir des modèles imbriqués dans le jeu de Go à l'aide de la bibliothèque standard? (Google App Engine)

Comment puis-je obtenir des modèles imbriqués comme Jinja a dans l'exécution python. À CONFIRMER ce que je veux dire, c'est comment faire, j'ai un tas de modèles héritent d'une base de modèles, tout dépôt dans les blocs de la base de modèles, à l'instar de Jinja/django-modèles. Est-il possible en utilisant seulement html/template dans la bibliothèque standard.

Si ce n'est pas une possibilité, quelles sont mes solutions de rechange. Moustache semble être une option, mais ce que je puis être à côté de ceux de nice des caractéristiques subtiles de html/template comme sensible au contexte échapper etc.? Quelles sont les autres alternatives sont ther?

(Environnement: Google App Engin, Aller de l'exécution v1, Dev - Mac OSx lion)

Merci pour la lecture.

139voto

tux21b Points 17336

Oui c'est possible. Un html.Template est en fait un ensemble de fichiers de modèle. Si vous exécutez un bloc définie dans cet ensemble, il a accès à tous les autres blocs définis dans cet ensemble.

Si vous créez une carte de tels ensembles de template sur votre propre, vous avez essentiellement de la même souplesse que Jinja / Django offre. La seule différence, c'est que le html/modèle paquet a pas d'accès direct au système de fichiers, de sorte que vous avez à analyser et à composer des modèles sur votre propre.

Prenons l'exemple suivant, deux pages différentes ("index.html" et "other.html") que les deux d'hériter de 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}}

Et la carte des ensembles de template:

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

Vous pouvez maintenant rendre votre "index.html" page en appelant tmpl["index.html"].Execute("base", data) et vous pouvez rendre votre "other.html" page en appelant tmpl["other.html"].Execute("base", data). Avec quelques astuces (par exemple, un uniforme convention de nommage de vos fichiers de modèle), il est même possible de générer de l' tmpl carte automatiquement.

5voto

Rob Points 484

Utilisation Pongo, qui est un super jeu de Go Modèles qui prend en charge le {{étend}} et {{bloc}} balises pour l'héritage de template, tout comme Django.

5voto

daemonl Points 354

J'ai été de retour pour cette réponse pendant des jours, enfin peu la balle et a écrit une petite couche d'abstraction / pre processeur pour ce. Qu'il est fondamentalement:

  • Ajoute le "s'étend" mot de modèles.
  • Permet primordial "définir" les appels (donc des valeurs par défaut pour greggory sont possibles)
  • Permet non défini 'template' appelle, ils viennent de donner une chaîne vide
  • Définit la valeur par défaut . dans le "modèle" des appels . de la société mère

https://github.com/daemonl/go_sweetpl

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X