wordpress テンプレート テーマ エンジンについて何も知らないので、いくつかの基準に応じてベース テンプレートを交換する方法を紹介したいと思います。
from pyramid.renderers import get_renderer
from pyramid.security import authenticated_userid
class Theme(object):
def __init__(self, context, request):
self.context = context
self.request = request
@property
def layout(self):
if utils.likes_blue_color(authenticated_userid(self.request)):
template_name = 'templates/blue_layout.pt'
else:
template_name = 'templates/green_layout.pt'
return get_renderer(template_name).implementation()
@view_config(...)
def index(context, request):
theme = Theme(context, request)
return { 'context':context,
'request': request,
'theme':theme,
}
レイアウトテンプレートは次のようになります
<html ...
metal:define-macro="master">
....
<metal:sidebar define-slot="sidebar">...</metal:sidebar>
<metal:body define-slot="main">...</metal:body>
</html>
そして、残りのテンプレートはそれを次のように使用します。
<html ...
metal:use-macro="theme.layout.macros['master']">
<metal:main fill-slot="main">
Hi there!
</metal:main>
</html>
このアプローチを使用すると、いくつかのパラメーター (リクエストの値、Cookie、データベースのユーザー設定など) に基づいて基本テンプレートを交換できます。
Jinja2 テンプレートの場合、アプローチは似ています。ビュー関数で必要なベース テンプレートを特定し、ベース テンプレート オブジェクトへの参照、またはベース テンプレートのファイル名を関数に渡します。Jinja2 のドキュメントから、{% extends my_base_template_passed_from_the_view_function %}
構文が機能する可能性があるようです。それ以外の場合は、カスタム テンプレート ローダーを指定して、条件に基づいて別のテンプレートをロードする必要がある場合があります。