如何在portal_factory中创建和填充Plone对象?

时间:2011-11-01 19:47:05

标签: plone

我需要从第二个对象(object2视图创建一个(原型)对象 - 它不是新对象的父对象。它需要预先填充来自请求object2的数据。

简单的解决方案似乎是在架构字段上使用“default_method”,这可以用于来自请求的数据,但我不相信我可以访问View从那里开始,因此也不到object2。在任何情况下,其中一个字段是object2的ReferenceField,我读过ReferenceField忽略“default_method”。

另一个选项是在portal_factory中创建它,设置其默认值,然后显示“添加”页面,允许用户根据需要修改内容,或者在不实际创建对象的情况下退出。完美的,除了可用于创建对象的众多方法之外,(invokeFactory()_createObjectByType()_constructInstance()& createObject(),我知道),仅{ {1}}实际上将对象留在portal_factory中 - 因为它只返回一个字符串(对象的Add页面的URL),不接受关键字参数,并且似乎没有通知任何事件(当然不是IObjectCreatedEvent) ,在将用户引导到编辑页面之前,我无法看到如何使用我的数据修改它。

2 个答案:

答案 0 :(得分:4)

卫生署。终于想通了。

在任何真正意义上,

createObject 都不会创建一个对象。它实际上只是创建表单的URL。

致电.createObject(),获取表单的网址,附上您想要的值作为查询参数:

url = folder.createObject(type_name='xxx')
url += ?title=abc&description=def...'
self.request.RESPONSE.redirect(url)

会这样做。

答案 1 :(得分:4)

这是我不推荐使用createObject时推荐的模式:

_id = self.context.generateUniqueId("Document")
_id = self.context.invokeFactory(type_name=type_name, id=_id)
ob = self.context[_id]
ob.edit(
    description = "text...",
    subject     = ('tag1', 'tag2'),
    title       = "some title...",
)
ob._renameAfterCreation(check_auto_id=True)
_id = ob.getId()