【问题标题】:Changing template using Pyramid, traversal and PyMongo使用 Pyramid、traversal 和 PyMongo 更改模板
【发布时间】:2012-12-11 10:51:33
【问题描述】:

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

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


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

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

【问题讨论】:

  • 如果您更详细地解释您想要实现的目标,这将有所帮助 - 并非每个 Python 开发人员都熟悉 wordpress 模板主题引擎。另外,traversal 和 mongodb 是如何适应的?您是否希望主题标识符位于 URL 中并从 mongodb 加载主题?
  • 嗨,我添加了更多细节,我使用的是 jinja2,而不是默认的金字塔模板。我的想法是更改 @view_config(context='XXX', renderer='/static/themes/mybluetheme/index.jinja2')... 但是我似乎无法找到改变值的方法在渲染器中
  • 我已经更新了我的答案。基本思想是覆盖多个模板使用的基本模板可能比尝试使用@view_config 的renderer 参数做技巧要容易得多

标签: python themes pyramid traversal template-engine


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多