領域的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>}
我真的覺得你不應該這樣做:-)
如果我有什麼不對請正確......它有點難以理解這個原型的行爲。
我只是猜測,但可能是因爲你已經創建了一個空圖像字段的圖像內容。也許第一次調用創建一個空的blob,而它沒有任何回報 –