Plone 创建对象时DocTest失败

Plone 创建对象时DocTest失败,plone,plone-4.x,Plone,Plone 4.x,我在doctest中遇到问题,因为我试图重命名IObjectAddedEvent处理程序中内容类型对象的ID。我的要求是具有顺序和上下文特定的ID,如CAM-001、CAM-002、BLK-001、BLK-002等 当我在浏览器中手动添加对象时,事件处理程序会正确重命名id,但当我尝试在doctest中创建它时,它在添加到其容器后很快就会失败。plone.dexterity addContentToContainer使用原始id调用_setObject,然后事件处理程序启动并重命名该id,然后当

我在doctest中遇到问题,因为我试图重命名IObjectAddedEvent处理程序中内容类型对象的ID。我的要求是具有顺序和上下文特定的ID,如CAM-001、CAM-002、BLK-001、BLK-002等

当我在浏览器中手动添加对象时,事件处理程序会正确重命名id,但当我尝试在doctest中创建它时,它在添加到其容器后很快就会失败。plone.dexterity addContentToContainer使用原始id调用_setObject,然后事件处理程序启动并重命名该id,然后当_getObject使用原始id时,它显然找不到该对象,因此会导致属性错误

我创建了一个产品来说明这一点

我还尝试在doctest中使用plone.api,但也失败了


欢迎所有想法。

由于您使用的是灵巧性,最好的解决方案是编写自己的
NameGenerator
行为

我猜您的DX内容激活了以下行为:

此bahavior负责在创建后重命名该项。 您应该删除此项并添加自己的

例如:

使用zcml注册行为


对应的python代码

从plone.app.content.interfaces导入INameFromTitle
从zope.component导入getUtility
从zope.interface导入实现
INAME生成器中的类(INAMEFROMSTITLE):
“”行为接口。
"""
类名称生成器(对象):
“”“来自标题行为的自定义名称。”
"""
机具(INameGenerator)
定义初始化(自身,上下文):
self.context=context
@财产
def标题(自我):
#您的实现
标题=。。。
返回标题
重要: 从INameFromTitle继承您的界面

现在将
添加到您的内容行为中


可能从您的内容类型中删除
INameFromTitle
行为就足够了,但是显式实现您自己的行为会更好。

我的答案有什么问题吗?谢谢@Mathias,这是一个更干净的解决方案。不幸的是,在这种情况下,我使用容器来确定新ID,而对象还没有确定已添加到容器中。我将尝试创建一个AddForm,以生成新ID并将其传递到对象创建中。您可以使用“self.context.aq_parent”访问容器“,或者之后这样做有问题吗?从内容中删除INameFromTitle的
INameFromTitle
行为也没有效果?此时,新对象没有父对象,我想它还没有添加到容器中。我已经把INAME从标题行为中删除了。我目前的解决方法是自定义AddForm,它将ID传递给create方法,但我认为我应该查看ID服务器,而不是基于对象对等方的ID生成ID服务器。