2011-07-07 29 views
0

我有:unrestrictedTraverse获取错误的对象时,有两个相邻的相同的id

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/。上面的代码应该会给出一个AtributeError,但是我得到的却是对象而不是其他类型的对象。它打印:

<ATFolder at /Plone/s/a/2011/07 used for /Plone/s/a/2011/07> 

我不想从遍历中得到“相似”的结果,这是错误的。我特别需要/Plone/s/a/2011/07/07/。如果它不存在,我想赶上例外。

我可以使用哪些其他的办法,看看是否有在/Plone的/ S是一个对象正好/ A/2011/07/07/,而不是足够接近/Plone的/ S/A/2011/07/

回答

4

您点击收购。

您想获得'07'文件夹的'07'元素/属性/属性。但是最后一个没有这个id的子对象。因此,由于收购,现有的'07'文件夹向其父元素询问是否具有提及的ID的子对象,当然,'2011'文件夹中包含该元素,您正在坐的'07' 。

这是对采集如何工作的粗略解释。

另一个例子是这样的URL: http://plone.org/news/news/news/news/news/events

的 '事件' 文件夹并没有真正在 '新闻' 文件夹活。所有这些'新闻'文件夹都不是真的存在,但至少有一个'news'文件夹存在于plone.org根目录中,虽然它没有'events'文件夹,但它的父目录(plone.org再次)的确如此。

这里有一些参考:

如果你想确保一个元素/属性/属性是真的,你应该使用aq_base父元素的一部分来自Acquisition

from Acquisition import aq_base 

plone = aq_base(self.portal.Plone) 
s = aq_base(getattr(plone, 's')) 
a = aq_base(getattr(s, 'a')) 
year = aq_base(getattr(a, '2011')) 
month = aq_base(getattr(year, '07')) 
day = aq_base(getattr(month, '07')) 

aq_base从元素中剥离了收购链,因此不会使用收购来获得其元素。

+0

当然你得到你的参数向后: '年= aq_base(GETATTR( '2011',A))' 应该是: '年= aq_base(GETATTR(一, '2011'))' 否则,好吧。 OP可能不喜欢它,但收购是Zope的重要组成部分,如果我们停止使用它,一大堆东西就会崩溃! – Auspex

+0

@marcosfromero:我知道这将是收购,我只是想知道我该如何解决这个问题。因此,而不是使用unrestrictedTraverse,我可以使用aq_base和getattr。你发布的片段真的很自我解释。它是一个很好的解决方案。而且我知道收购至关重要@Auspex,并感谢您的更正。 –

+0

一天现在没有收购上下文和绝对的URL生成和其他服务将失败... –

相关问题