Plone/IRelatedItems- 如何以编程方式设置灵巧内容类型的相关项目?
Plone/IRelatedItems- How can I programatically set relatedItems of a dexterity content type?
在一个事件 IAfterTransitionEvent 中,我试图捕获一个对象被发布的事件,当该对象被发布时,两个对象被创建并且我想要关联。
在正在发布的对象的类型 xml 文件中,我添加到行为中:
element value="plone.app.relationfield.behavior.IRelatedItems"
这样我就可以得到相关的物品。
在我的事件函数中,我有:
@grok.subscribe(InitialContract, IAfterTransitionEvent)
def itemPublished(obj, event):
site = api.portal.get()
if event.status['action'] == 'publish':
house_agreement = customCreateFunction(container...,type..)
#I get the HouseAgreement object
labor_contract = customCreateFunction(container....,type)
#I get the LaborContract object
relIDs = []
relIDs.append(RelationValue(IUUID(house_agreement)))
relIDs.append(RelationValue(IUUID(labor_contract)))
obj.relatedItems = relIDs
不幸的是,打印 obj.relatedItems 给我一个空列表,当我转到视图 class 并在分类下查看时,相关项目字段为空。
我尝试了 _relatedItems 而不是 relatedItems,但这似乎不起作用,因为我认为它为 obj 创建了一个属性。
我也尝试过只使用 IUUID 而不是将其转换为 RelationValue,但这根本不会给我任何错误。
它好像没有设置 relatedItems 值,但似乎接受传递的列表。
如果可能,我如何以编程方式设置 relatedItems?
此外,我确实计划添加代码以防止对象被添加两次。
您需要存储一个关系值列表。
>>> from zope.component import getUtility
>>> from zope.intid.interfaces import IIntIds
>>> from z3c.relationfield import RelationValue
>>> intids = getUtility(IIntIds)
>>> source.relatedItems = [RelationValue(self.intids.getId(target))]
>>> source.relatedItems
[<z3c.relationfield.relation.RelationValue object at 0x10bf2eed8>]
您现在可以通过...访问目标
>>> target_ref = source.relatedItems[0]
>>> target_ref.to_object
<XXX at / Plone/target>
我的代码示例的重要变化是:
- RelationValues 基于 Intid 而不是 uuid。
在一个事件 IAfterTransitionEvent 中,我试图捕获一个对象被发布的事件,当该对象被发布时,两个对象被创建并且我想要关联。
在正在发布的对象的类型 xml 文件中,我添加到行为中:
element value="plone.app.relationfield.behavior.IRelatedItems"
这样我就可以得到相关的物品。
在我的事件函数中,我有:
@grok.subscribe(InitialContract, IAfterTransitionEvent)
def itemPublished(obj, event):
site = api.portal.get()
if event.status['action'] == 'publish':
house_agreement = customCreateFunction(container...,type..)
#I get the HouseAgreement object
labor_contract = customCreateFunction(container....,type)
#I get the LaborContract object
relIDs = []
relIDs.append(RelationValue(IUUID(house_agreement)))
relIDs.append(RelationValue(IUUID(labor_contract)))
obj.relatedItems = relIDs
不幸的是,打印 obj.relatedItems 给我一个空列表,当我转到视图 class 并在分类下查看时,相关项目字段为空。 我尝试了 _relatedItems 而不是 relatedItems,但这似乎不起作用,因为我认为它为 obj 创建了一个属性。 我也尝试过只使用 IUUID 而不是将其转换为 RelationValue,但这根本不会给我任何错误。
它好像没有设置 relatedItems 值,但似乎接受传递的列表。
如果可能,我如何以编程方式设置 relatedItems?
此外,我确实计划添加代码以防止对象被添加两次。
您需要存储一个关系值列表。
>>> from zope.component import getUtility
>>> from zope.intid.interfaces import IIntIds
>>> from z3c.relationfield import RelationValue
>>> intids = getUtility(IIntIds)
>>> source.relatedItems = [RelationValue(self.intids.getId(target))]
>>> source.relatedItems
[<z3c.relationfield.relation.RelationValue object at 0x10bf2eed8>]
您现在可以通过...访问目标
>>> target_ref = source.relatedItems[0]
>>> target_ref.to_object
<XXX at / Plone/target>
我的代码示例的重要变化是:
- RelationValues 基于 Intid 而不是 uuid。