unrestrictedTraverse получает неправильный объект, когда есть два смежных идентификатора - PullRequest
0 голосов
/ 08 июля 2011

У меня есть:

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 / a / 2011/07/07 /, а не достаточно близко , как / Plone / s / a / 2011/07 / ?

1 Ответ

4 голосов
/ 08 июля 2011

Вы нажали приобретение.

Вы хотите получить элемент / свойство / атрибут «07» папки «07».Но у этого последнего нет подобъекта с таким идентификатором.Таким образом, из-за приобретения существующая папка '07' запрашивает у своего родительского элемента, есть ли у нее подобъект с указанным идентификатором, и, конечно, папка '2011' имеет этот элемент, тот, в котором вы сидите '07'..

Это грубое объяснение того, как работает сбор данных.

Другой пример этого URL: http://plone.org/news/news/news/news/news/events

Папка 'events' на самом деле не жить в папке «новости».И всех этих папок «новостей» на самом деле нет, но есть по крайней мере одна папка «новостей», живущая в корне plone.org, и хотя у нее нет папки «событий», ее родитель (снова 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 убирает цепочку сбора данных из элемента, поэтому приобретение не будет использованочтобы получить его элементы.

...