在用Plone创建BrowserView时,我知道可以选择使用ZCML配置模板,如下所示:
<configure
xmlns:browser="http://namespaces.zope.org/browser"
>
<browser:page
…
class=".foo.FooView"
template="foo.pt"
…
/>
</configure>或者在代码中:
# 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。如果这两个类之间存在显著差异呢?
发布于 2012-12-14 09:53:03
注意:要完全等同于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')在浏览器视图中可以使用的另一个模式是添加一个update方法。
class FooView(BrowserPage):
index = ViewPageTemplateFile('foo.pt')
def __call__(self):
self.update()
return self.index()
def update(self):
self.portal_catalog = ... # initialize code但这不是问题所在。
那么,有什么不同呢?,没有区别,。浏览器视图必须是可调用的。ZCML指令以对象具有必须返回呈现页面的索引的方式构建此可调用的。
但是,在每个调用(您的示例)上创建模板有一个不同之处:您正在浏览器视图的每个调用上创建模板的新实例。类变量的情况并非如此。
最后一个选项:在指令中不需要类参数
<configure xmlns:browser="http://namespaces.zope.org/browser">
<browser:page
…
template="foo.pt"
…
/>
</configure>有关更多信息,请阅读使用指令的代码的SimpleViewClass,其中src是模板名。。
发布于 2012-12-14 06:11:03
在Plone中,只有在模板显式注册(例如使用ZCML或Grok-指令)时,才能定制模板TTW (通过portal_view_customizations)。
如果只在__call__中定义模板,则不会在portal_view_customizations中看到它。
此外,我猜想在方法中加载模板会为每个视图实例(每个请求)从磁盘重新加载模板。
发布于 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一起使用BrowserPage或BrowserView似乎并不重要。
https://stackoverflow.com/questions/13871915
复制相似问题