2

如果我想实现类似 WordPress 模板主题引擎的东西,我应该如何使用 Pyramid、遍历和使用 MongoDB 作为数据库来实现。

我试过在Extending An Existing Pyramid Application上查找它,但它根本没有任何意义......


基本上,在管理控制面板中,当所有者转到 时www.mydomain.com/admin/template,页面将显示位于 /static/themes/ 中的所有主题文件夹。

当管理员选择主题“mybluetheme”时,主题将存储在 MongoDB 中。因此,当我在 中查看它时www.mydomain.com/,它将使用“mybluetheme”显示主题。如果明天,管理员选择“mygreentheme”,该站点将呈现“mygreentheme”。

4

1 回答 1

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 模板,方法类似——您在视图函数中确定所需的基本模板,并将对基本模板对象的引用或基本模板的文件名传递给您的函数。从Jinja2 文档看来,{% extends my_base_template_passed_from_the_view_function %}语法可能有效。否则,您可能需要指定自定义模板加载器以根据某些条件加载不同的模板。

于 2012-12-11T21:28:54.070 回答