首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZCML和ViewPageTemplateFile中的模板有什么区别?

ZCML和ViewPageTemplateFile中的模板有什么区别?
EN

Stack Overflow用户
提问于 2012-12-14 02:44:34
回答 3查看 501关注 0票数 6

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

代码语言:javascript
复制
<configure

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

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

</configure>

或者在代码中:

代码语言:javascript
复制
# foo.py
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.publisher.browser import BrowserPage


class FooView(BrowserPage):
    """
    My View
    """

    def __call__(self):
        return ViewPageTemplateFile('foo.pt')(self)

这两种方法有什么不同吗?他们两人的结果似乎是一样的。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-14 09:53:03

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

代码语言:javascript
复制
# foo.py
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.publisher.browser import BrowserPage
class FooView(BrowserPage):
    index = ViewPageTemplateFile('foo.pt')

在浏览器视图中可以使用的另一个模式是添加一个update方法。

代码语言:javascript
复制
class FooView(BrowserPage):
    index = ViewPageTemplateFile('foo.pt')
    def __call__(self):
        self.update()
        return self.index()

    def update(self):
        self.portal_catalog = ...  # initialize code

但这不是问题所在。

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

但是,在每个调用(您的示例)上创建模板有一个不同之处:您正在浏览器视图的每个调用上创建模板的新实例。类变量的情况并非如此。

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

代码语言:javascript
复制
<configure xmlns:browser="http://namespaces.zope.org/browser">
  <browser:page
    …
    template="foo.pt"
    …
    />
</configure>

有关更多信息,请阅读使用指令的代码SimpleViewClass,其中src是模板名。

票数 8
EN

Stack Overflow用户

发布于 2012-12-14 06:11:03

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

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

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

票数 7
EN

Stack Overflow用户

发布于 2012-12-14 04:33:10

AFAIK,有无差异。ZCML指令生成带有ViewClass的ViewPageTemplateFile,并在__call__上呈现模板。请参见zope.browserpage.metaconfigure.page第132,151行。

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

至于子问题:据我理解,在Zope2 2/Plone的背景下,差异并不明显。基于接口(zope.publisher.interfaces.browser.IBrowserPage),BrowserPage是您想要继承的基类,因为它实现了__call__browserDefault。然而,与Plone一起使用BrowserPageBrowserView似乎并不重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13871915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档