Plone 当存在两个相邻的相同ID时,unrestrictedTraverse获取错误的对象
我有: /Plone/s/a/2011/07/07/不存在/Plone/s/a/2011/07/存在。上面的代码应该给出一个AtributeError,但是我得到了/Plone/s/a/2011/07/对象。它打印:Plone 当存在两个相邻的相同ID时,unrestrictedTraverse获取错误的对象,plone,Plone,我有: /Plone/s/a/2011/07/07/不存在/Plone/s/a/2011/07/存在。上面的代码应该给出一个AtributeError,但是我得到了/Plone/s/a/2011/07/对象。它打印: try: path1 = /Plone/s/a path2 = 2011/07/07 #The path to traverse becomes /Plone/s/a/2011/07/07/. From #Plone to last 07, they
try:
path1 = /Plone/s/a
path2 = 2011/07/07
#The path to traverse becomes /Plone/s/a/2011/07/07/. From
#Plone to last 07, they are normal Folders.
ob = self.portal.unrestrictedTraverse('%s/%s/' % (path1, path2))
print ob
except AtributeError:
#do something
pass
我不想从导线测量中得到“类似”的结果,这是错误的。我特别需要/Plone/s/a/2011/07/07/。如果它不存在,我想捕获异常
我可以使用哪些其他方法来查看是否有一个对象正好位于/Plone/s/a/2011/07/07/,而不是像/Plone/s/a/2011/07/那样靠近?您点击了采集
您想获取“07”文件夹的“07”元素/属性/属性。但最后一个文件夹没有具有该id的子对象。因此,由于获取的原因,现有的“07”文件夹会询问其父元素是否有具有所述id的子对象,当然,“2011”文件夹中有该元素,即您所坐的“07”元素
这是对收购如何运作的粗略解释
另一个例子是以下URL:
“事件”文件夹实际上不在“新闻”文件夹中。所有这些“新闻”文件夹实际上并不存在,但至少有一个“新闻”文件夹存在于plone.org根目录中,尽管它没有“事件”文件夹,但它的父文件夹(plone.org)有
这里有一些参考资料:
Acquisition
中的aq_base
:
<ATFolder at /Plone/s/a/2011/07 used for /Plone/s/a/2011/07>
aq_base
从元素中剥离采集链,因此不会使用采集来获取其元素。您点击采集
您想获取“07”文件夹的“07”元素/属性/属性。但最后一个文件夹没有具有该id的子对象。因此,由于获取的原因,现有的“07”文件夹会询问其父元素是否有具有所述id的子对象,当然,“2011”文件夹中有该元素,即您所坐的“07”元素
这是对收购如何运作的粗略解释
另一个例子是以下URL:
“事件”文件夹实际上不在“新闻”文件夹中。所有这些“新闻”文件夹实际上并不存在,但至少有一个“新闻”文件夹存在于plone.org根目录中,尽管它没有“事件”文件夹,但它的父文件夹(plone.org)有
这里有一些参考资料:
Acquisition
中的aq_base
:
<ATFolder at /Plone/s/a/2011/07 used for /Plone/s/a/2011/07>
aq_-base
将采集链从元素中剥离,因此不会使用采集来获取其元素。当然,您是在反向获取参数:year=aq_-base(getattr('2011',a))
应该是:year=aq_-base(getattr(a,'2011'))
否则,很好。OP可能不喜欢它,但收购是Zope的重要组成部分,如果我们停止使用它,很多东西都会坏掉@马可斯弗洛梅罗:我知道这将是收购,我只是想知道如何解决这个问题。因此,我可以使用aq_base和getattr,而不是使用UnlimitedTraverse。您发布的代码片段真是不言自明。这似乎是一个很好的解决办法。我知道收购是至关重要的@Auspex,谢谢你的更正。day现在没有收购上下文,绝对URL生成和其他服务将失败…@Auspex:谢谢,我更正了snippeet的代码@有人仍在使用你ms dos:从你的问题中,我不明白你知道关于采集的“上面的代码应该给出一个AtributeError”,这就是我解释的原因@martijn pieters:说得好,谢谢。@someone:不,生成的“day”对象将没有采集上下文,因为在检索时它被剥离了。这意味着像day.getPhysicalPath()
这样的调用将失败。您肯定是在反向获取参数:year=aq_base(getattr('2011',a))
应该是:year=aq_base(getattr(a,'2011'))
,否则,很好。OP可能不喜欢它,但收购是Zope的重要组成部分,如果我们停止使用它,很多东西都会坏掉@马可斯弗洛梅罗:我知道这将是收购,我只是想知道如何解决这个问题。因此,我可以使用aq_base和getattr,而不是使用UnlimitedTraverse。您发布的代码片段真是不言自明。这似乎是一个很好的解决办法。我知道收购是至关重要的@Auspex,谢谢你的更正。day现在没有收购上下文,绝对URL生成和其他服务将失败…@Auspex:谢谢,我更正了snippeet的代码@有人仍在使用你ms dos:从你的问题中,我不明白你知道关于采集的“上面的代码应该给出一个AtributeError”,这就是我解释的原因@martijn pieters:说得好,谢谢。@someone:不,生成的“day”对象将没有采集上下文,因为在检索时它被剥离了。这意味着像day.getPhysicalPath()
这样的调用将失败。