对 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 %}
语法可能有效。否则,您可能需要指定自定义模板加载器以根据某些条件加载不同的模板。