在Plone中创建BrowserView时,我知道我可以选择使用ZCML配置一个模板,如下所示:
<configure
xmlns:browser="http://namespaces.zope.org/browser"
>
<browser:page
…
class=".foo.FooView"
template="foo.pt"
…
/>
</configure>
或者在代码中:
^{pr2}$这两种方法有什么区别吗?它们似乎都产生了相同的结果。在
子问题:我知道有一个BrowserView
类可以导入,但通常每个人都使用BrowserPage
。如果这两个类之间存在任何显著差异呢?在
不过,没有什么区别。ZCML指令生成带有
ViewPageTemplateFile
的ViewClass,并在__call__
上呈现模板。参见zope.browserpage.metaconfigure.page
第132、151行。在这与您在示例中所做的完全相同:在您的
__call__
方法中显式实例化模板。在至于子问题:根据我的理解,在Zope2/Plone的上下文中,显著的差异并不明显。基于接口(}。但是,如果您将}与Plone一起使用似乎并不重要。在
zope.publisher.interfaces.browser.IBrowserPage
),BrowserPage是您想要继承的基类,因为它实现了__call__
和{BrowserPage
或{在Plone中,只有当模板被显式注册(例如使用ZCML或Grok指令)时,才能定制模板TTW(通过
portal_view_customizations
)。在如果只在
__call__
中定义模板,则在portal_view_customizations
中看不到它。在另外,我猜在方法中加载模板会为每个视图实例(每个请求)从磁盘重新加载模板。在
注意:要完全等价于ZCML,您应该设置
index
变量来指定您使用的模板。这样,TTW定制也可以工作。在另一种可以用于浏览器视图的模式是添加更新方法。在
^{pr2}$但这不是问题所在。在
那么有什么区别呢?没有区别。浏览器视图必须是可调用的。ZCML指令以对象具有必须返回呈现页的索引的方式来构建此可调用的。在
但是在每次通话中创建模板(您的示例)有一个区别: 每次调用浏览器视图时都将创建模板的新实例。 类变量不是这种情况。在
最后一个选项:指令中不需要类参数
有关详细信息,您应该阅读the code of the directive,它使用SimpleViewClass where src is the template name。在
相关问题 更多 >
编程相关推荐