如果我想实现类似WordPress模板主题引擎的东西,我应该如何使用Pyramid,遍历以及使用MongoDB作为数据库。
我试过在Extending An Existing Pyramid Application上查找它,但它根本没有任何意义......
基本上,在管理员控制面板中,当所有者转到www.mydomain.com/admin/template
时,该页面将显示位于/ static / themes /中的所有主题文件夹。
当管理员选择主题“mybluetheme”时,主题将存储在MongoDB中。因此,当我在www.mydomain.com/
中查看它时,它将使用“mybluetheme”显示主题。
如果明天,管理员选择“mygreentheme”,该网站将呈现“mygreentheme”。
答案 0 :(得分:3)
对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模板时,方法类似 - 您在视图函数中找出所需的基本模板,并将引用传递给基本模板对象,或者< em>您的函数的基本模板的文件名。从Jinja2 documentation开始,{% extends my_base_template_passed_from_the_view_function %}
语法可能会起作用。否则,您可能需要指定自定义模板加载器以根据某些条件加载不同的模板。