テンプレート内から別のテンプレートを読み込む

いわゆる include みたいなのがなかったので。
context/request/view/template などは継承されるが、tal:define/tal:repeat で設定した変数は継承されない。
context/request ゃ tal:define で設定した変数は使用できる。
ファイル名には絶対パス相対パスも使用可能。

  • implements.py
from zope.tales.expressions import StringExpr
from os import path
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile

class IncludedPageTemplate(ViewPageTemplateFile):

	__parent__ = None

	def setParent(self, parent):
		self.__parent__ = parent

	def pt_getContext(self, **_kw):
		namespace = super(IncludedPageTemplate, self).pt_getContext(**_kw)
		namespace.update(self.__parent__.contexts)
		namespace.update(self.__parent__.vars)
		return namespace


class TALIncludeTemplateExpr(StringExpr):
	def __call__(self, econtext):
		t = IncludedPageTemplate(path.join(path.split(econtext.source_file)[0], self._expr))
		t.setParent(econtext)
		return t(econtext.contexts['view'])
  • configure.zcml
<tales:expressiontype
	name="include"
	handler=".implements.TALIncludeTemplateExpr"
	/>
  • 使用例
<div tal:content="structure include:content.pt" />