2011-07-07 28 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生成和其他服務將失敗... –

相關問題