2011-07-07 1 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を与えるはずですが、代わりに/Plone/s/a/2011/07/オブジェクトを取得します。それは印刷する:

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

私はトラバースと "似た"結果を得たくない、これは間違っている。具体的には/Plone/s/a/2011/07/07/が必要です。それが存在しない場合、私は例外をキャッチしたい。私は、オブジェクトが/Ploneの/ sで正確にありますかどうかを確認するために使用できる他のアプローチ

/十分のような/ 2011/07/07/、およびない近い/Ploneの/ S/A/2011/07/

答えて

4

ヒット獲得。

'07'フォルダの '07'要素/属性/属性を取得したいとします。しかし、この最後のものにはそのidを持つサブオブジェクトはありません。したがって、取得のために、既存の '07'フォルダは、上記のIDを持つサブオブジェクトを持っているかどうかを親要素に尋ねます。もちろん、 '2011'フォルダにはその要素があります。 。

これは、取得の仕組みの概略です。 http://plone.org/news/news/news/news/news/events

'イベント' フォルダないのは本当に'ニュース' フォルダ内のライブ

別の例は、このURLです。これらの 'ニュース'フォルダは実際には存在しませんが、plone.orgのルートに少なくとも1つの 'news'フォルダがありますが、 '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生成やその他のサービスは失敗します... –

関連する問題