ZCML和ViewPageTemplateFi之间的区别是什么?

2024-05-15 19:50:29 发布

您现在位置:Python中文网/ 问答频道 /正文

在Plone中创建BrowserView时,我知道我可以选择使用ZCML配置一个模板,如下所示:

<configure

    xmlns:browser="http://namespaces.zope.org/browser"
    >

    <browser:page
        …
        class=".foo.FooView"
        template="foo.pt"
        …
        />

</configure>

或者在代码中:

^{pr2}$

这两种方法有什么区别吗?它们似乎都产生了相同的结果。在

子问题:我知道有一个BrowserView类可以导入,但通常每个人都使用BrowserPage。如果这两个类之间存在任何显著差异呢?在


Tags: orgbrowser模板zopehttpfooconfigureplone
3条回答

不过,没有什么区别。ZCML指令生成带有ViewPageTemplateFile的ViewClass,并在__call__上呈现模板。参见zope.browserpage.metaconfigure.page第132、151行。在

这与您在示例中所做的完全相同:在您的__call__方法中显式实例化模板。在

至于子问题:根据我的理解,在Zope2/Plone的上下文中,显著的差异并不明显。基于接口(zope.publisher.interfaces.browser.IBrowserPage),BrowserPage是您想要继承的基类,因为它实现了__call__和{}。但是,如果您将BrowserPage或{}与Plone一起使用似乎并不重要。在

在Plone中,只有当模板被显式注册(例如使用ZCML或Grok指令)时,才能定制模板TTW(通过portal_view_customizations)。在

如果只在__call__中定义模板,则在portal_view_customizations中看不到它。在

另外,我猜在方法中加载模板会为每个视图实例(每个请求)从磁盘重新加载模板。在

注意:要完全等价于ZCML,您应该设置index变量来指定您使用的模板。这样,TTW定制也可以工作。在

# foo.py
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.publisher.browser import BrowserPage
class FooView(BrowserPage):
    index = ViewPageTemplateFile('foo.pt')

另一种可以用于浏览器视图的模式是添加更新方法。在

^{pr2}$

但这不是问题所在。在


那么有什么区别呢?没有区别。浏览器视图必须是可调用的。ZCML指令以对象具有必须返回呈现页的索引的方式来构建此可调用的。在

但是在每次通话中创建模板(您的示例)有一个区别: 每次调用浏览器视图时都将创建模板的新实例。 类变量不是这种情况。在

最后一个选项:指令中不需要类参数

<configure xmlns:browser="http://namespaces.zope.org/browser">
  <browser:page
    …
    template="foo.pt"
    …
    />
</configure>

有关详细信息,您应该阅读the code of the directive,它使用SimpleViewClass where src is the template name。在

相关问题 更多 >