Hallo Harlequin,
Noch eine Anmerkung dazu die mir gerade noch eingefallen ist und die erklärt, warum das für mich zu viel Code im Template ist: es ist zu speziell. Damit kann man zwar wunderbar die Einträge eines Gästebuchs ausgeben, aber eine Webpresänz besteht normalerweise aus mehr: Galerie, News, Kontaktformualr, etc.
Dann hast Du halt einfach mehrere Templates - eins für das Gästebuch, eins für das Kontaktformular, etc... Genauso wie man im Normalfall multiple statische HTML-Seiten haben kann.
Die Frage ist jetzt, ist es möglich Templates innerhalb von Templates zu verwenden? Also einen Master fürs Komplett-Layout und dann nochmal eines (je nach Anfroderung verschiedenes) für die Inhalte?
Ja, das geht, bei Genshi auf zwei verschiedene Arten:
1. Ein "Master-Template", das die Einzel-Templates einbindet (schriebst Du schon), allerdings möchte ich auf Deinen Einwand eingehen:
[1] Was ich grad bei Genshi entdeckt hab ist zumindest ein include. Der muss dann aber auch wieder mittels if im Template gesteuert werden, womit sich die Programmierung wieder ins Template verlagert.
Wieso if?
<xi:include href="${subtemplate}.html" />
Das heißt: Dein "Master-Template" lädt dann nur genau das Subtemplate, das ihm von Deinem Programmcode aus übergeben wird. Bzw, wenn Du multiple Templates an die gleiche Stelle einfügen können willst, kannst Du auch - ohne dass es großartig komplizierter wird - folgendes machen:
<xi:include href="${subtemplate}.html" py:for="subtemplate in subtemplates" />
(und dann die Variable subtemplates auf eine Liste von Templates setzen, die da eingefügt werden sollen)
Ich kann da wirklich nicht nachvollziehen, warum das zu viel Code in den Templates sein soll. Bedenke doch auch, dass es bei Templates darum geht, Präsentation von Prozesslogik zu trennen - und das erreichst Du wiederum nicht, wenn Du zu viele Teile wieder in den normalen Programmcode lagerst.
Zudem, es gibt noch eine zweite (sehr coole) Möglichkeit, mit Genshi Layout etc. zu realisieren: Match-Templates.
Du bindest im Endeffekt nur minimalistische Templates für die jeweiligen Spezialanwendungen, die Du haben willst, ein und diese haben ein einziges Include drin, das das Master-Template lädt, z.B. so:
<!DOCTYPE ...>
<html ...>
<xi:include href="layout.html" />
<head>
<title>Gästebuch</title>
</head>
<body>
<h3>Gästebuch</h3>
<div py:for="eintrag in eintraege">
<p>${eintrag}</p>
</div>
</body>
</html>
Und dann im Master-Template:
<html ... py:strip="">
<head py:match="head" py:attrs="select('@*')">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- weitere meta-Tags oder <link> oder sonstwas was ins <head> JEDER
Seite gehört -->
<!-- im folgenden wird kein <meta/> stehen, sondern alle Elemente, die
im <head> auf der Spezialseite vorhanden sind; man kann's natürlich
auch anders realisieren, dies ist nur ein Beispiel: -->
<meta py:replace="select('*|text()')">
</head>
<body py:match="body" py:attrs="select('@*')">
<h1>...</h1>
<!-- navigation hier einfügen -->
<div class="blub">
<!-- irgendwelche div-konstrukte -->
<!-- und HIER DRIN jetzt der eigentliche inhalt von vorher: -->
<div py:replace="select('*|text()')">Dieser Text samt dem div wird ersetzt.</div>
</div>
</body>
</html>
Heraus käme dann sowas wie:
<!DOCTYPE ...>
<html ...>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- weitere meta-Tags oder <link> oder sonstwas was ins <head> JEDER
Seite gehört -->
<title>Gästebuch</title>
</head>
<body>
<h1>...</h1>
<!-- navigation hier einfügen -->
<div class="blub">
<!-- irgendwelche div-konstrukte -->
<h3>Gästebuch</h3>
<div>
<p>1. Eintrag</p>
</div>
<div>
<p>2. Eintrag</p>
</div>
<div>
<p>3. Eintrag</p>
</div>
</div>
</body>
</html>
Siehe auch die Doku zu Genshi.
Viele Grüße,
Christian