覆盖视图(来自其他包),修复浏览器层优先级
Override view (from other package), fix browser layers priority
我有一个 other.package
注册视图 my_view
。然后我试图用我的 this.package
.
中定义的视图替换此视图
<browser:page
for="other.package.interfaces.IBarClass"
name="my_view"
class="this.package.views.FooClass"
permission="zope2.View"
layer="this.package.interfaces.IThisPackageContentLayer"
/>
出于某种原因 my_view
未被覆盖。我认为它可能与图层优先级有关,但我不知道如何解决它。有什么建议吗?
如果我重命名视图 (name="my_view_new"
),它会按预期工作。但如果使用相同的名字,原来的似乎有优先权。我该如何更改?
更新:
关于图层优先级:
(Pdb) self.request.__provides__.__iro__[13]
<InterfaceClass other.package.interfaces.layer.IOriginalLayer>
(Pdb) self.request.__provides__.__iro__[14]
<InterfaceClass this.package.content.interfaces.IThisPackageContentLayer>
You can check the activated layers from HTTP request object by looking
at self.request.provides.iro. Layers are evaluated from zero
index (highest priority) the last index (lowest priority). (source)
所以,问题是我如何确定图层的优先级?
问题已通过以这种方式固定图层的优先级得到解决:
class IThisPackageContentLayer(IOriginalLayer):
按照建议 here。
另一种方法是,对同一浏览器层使用 ZCML-Overrides。
这也应该覆盖原始层,但是对原始层进行子类化的解决方案有点不错;)。
我有一个 other.package
注册视图 my_view
。然后我试图用我的 this.package
.
<browser:page
for="other.package.interfaces.IBarClass"
name="my_view"
class="this.package.views.FooClass"
permission="zope2.View"
layer="this.package.interfaces.IThisPackageContentLayer"
/>
出于某种原因 my_view
未被覆盖。我认为它可能与图层优先级有关,但我不知道如何解决它。有什么建议吗?
如果我重命名视图 (name="my_view_new"
),它会按预期工作。但如果使用相同的名字,原来的似乎有优先权。我该如何更改?
更新: 关于图层优先级:
(Pdb) self.request.__provides__.__iro__[13]
<InterfaceClass other.package.interfaces.layer.IOriginalLayer>
(Pdb) self.request.__provides__.__iro__[14]
<InterfaceClass this.package.content.interfaces.IThisPackageContentLayer>
You can check the activated layers from HTTP request object by looking at self.request.provides.iro. Layers are evaluated from zero index (highest priority) the last index (lowest priority). (source)
所以,问题是我如何确定图层的优先级?
问题已通过以这种方式固定图层的优先级得到解决:
class IThisPackageContentLayer(IOriginalLayer):
按照建议 here。
另一种方法是,对同一浏览器层使用 ZCML-Overrides。 这也应该覆盖原始层,但是对原始层进行子类化的解决方案有点不错;)。