2014-03-12 24 views
1

BlobWrapper圖像字段的存取器的第一個調用返回None,第二個調用返回BlobWrapper。一些提示?爲什麼圖像字段訪問器的第一次和第二次調用的返回值不同?

In [1]: id = app.Plone.invokeFactory('Image', 'myimage', title='MyImage') 

In [2]: image=app.Plone[id] 

In [3]: blobWrapper=image.getBlobWrapper() 

In [4]: accessor=blobWrapper.getField('image').getAccessor(blobWrapper) 

In [5]: accessor() 

In [6]: accessor() 
Out[6]: <plone.app.blob.field.BlobWrapper at 0xa35a194> 
+0

我只是猜測,但可能是因爲你已經創建了一個空圖像字段的圖像內容。也許第一次調用創建一個空的blob,而它沒有任何回報 –

回答

1

領域的getAccessor方法拍攝對象在這種情況下,你ATImage instance作爲參數不是blobWrapper instance

>>> accessor = image.getField('image').getAccessor(image) 
>>> accessor() 
<plone.app.blob.field.BlobWrapper object at 0x1050446e0> 

檢查this github link

security.declarePublic('getAccessor') 
def getAccessor(self, instance): 
    """Return the accessor method for getting data out of this 
    field""" 
    if self.accessor: 
     return getattr(instance, self.accessor, None) 
    return None 

UPDATE: Explenation爲什麼第一次調用的訪問者是None,其次不是。

我與產品的原型有關.Archetypes。 如果你通過了BlobWrapper實例,而不是一個ATImage實例,會發生以下情況:

第一次調用: 在某些時候原型ObjectField的get方法被調用,見https://github.com/plone/Products.Archetypes/blob/master/Products/Archetypes/Field.py#L785

它惹人AttributeError的( AttributeError: Attribut...'image'),這順便說一句。通常在將新字段添加到ContentType時發生,因爲BlobWrapper實例沒有屬性image(ATImage將具有此屬性)。

然後它將您的BlobWrapper初始化爲ATImage上的新字段。 這依舊對你Blobwrapper例如一些廢話,你不希望:-) 返回值是None,看到https://github.com/plone/Products.Archetypes/blob/master/Products/Archetypes/Field.py#L803

第二個電話: 自第一次調用做了一些修改您的BlobWrapper例如,第二個調用工作並返回正確的值。 https://github.com/plone/Products.Archetypes/blob/master/Products/Archetypes/Field.py#L785

從技術上講,第一個調用在您的BlobWrapper實例上初始化一個AnnotationStorage

> /Users/maethu/.buildout/eggs-cache/Products.Archetypes-1.9.4-py2.7.egg/Products/Archetypes/Storage/annotation.py(62)get() 
-> def get(self, name, instance, **kwargs): 
(Pdb) l 
57    """Clean up data in set method 
58    """ 
59    raise NotImplementedError 
60 
61   security.declarePrivate('get') 
62 ->  def get(self, name, instance, **kwargs): 
63    ann = getAnnotation(instance) 
64    value = ann.getSubkey(self._key, subkey=name, default=_marker) 
65    if value is _marker: 
66     if self._migrate: 
67      value = self._migration(name, instance, **kwargs) 
(Pdb) name 
'image' 
(Pdb) instance 
<plone.app.blob.field.BlobWrapper object at 0x10d4042a8> 
(Pdb) getAnnotation(instance) 
{'Archetypes.storage.AnnotationStorage-image': <plone.app.blob.field.BlobWrapper object at 0x10d430a28>} 

我真的覺得你不應該這樣做:-)

如果我有什麼不對請正確......它有點難以理解這個原型的行爲。

+0

是的。我忍不住這個。但是爲什麼這個行爲在blobWrapper.getField('image')。getAccessor(blobWrapper)'?我期望(第一和第二)調用返回相同。就像'image.getField('image'),getAccessor(image)'和'blobWrapper.getField('image')。getAccessor(image)''一樣。 – wolfrevo

+1

@wolfrevo我更新了我的答案。我向Archetypes求助,現在我覺得有點骯髒:-) – Mathias

+0

@Matthias感謝您的詳細解釋。從最佳做法的角度來看,我希望第一次調用可以做所有必要的修改並返回正確的值。恕我直言,這是一個錯誤。 1+和tnx爲您的努力。我會將其標記爲已回答。 – wolfrevo

相關問題