Как мне создать и заполнить объект Plone в portal_factory? - PullRequest
4 голосов
/ 01 ноября 2011

Мне нужно создать объект (архетипы) из Представления второго объекта (object2 - который не является родителем нового объекта). Его необходимо предварительно заполнить данными из запроса и object2.

Казалось бы, простое решение - использовать "default_method" в полях схемы, и это может работать для данных из запроса, но я не верю, что у меня есть доступ к представлению из там, и поэтому не до object2, либо. В любом случае, одно из полей - это ReferenceField для object2, и я прочитал, что ReferenceField игнорирует "default_method".

Другой вариант - создать его внутри portal_factory, установить его значения по умолчанию, а затем отобразить страницу «Добавить», позволяющую пользователю изменять содержимое по мере необходимости, или выйти без фактического создания объекта. Прекрасно, за исключением того, что из множества методов, доступных для создания объекта (invokeFactory(), _createObjectByType(), _constructInstance() & createObject(), о которых я знаю), только createObject фактически оставляет объект в portal_factory - и поскольку он возвращает только строку (URL-адрес страницы добавления объекта), не принимает аргументы ключевых слов и, похоже, не уведомляет о каких-либо событиях (конечно, не IObjectCreatedEvent), я не вижу, как это изменить с помощью мои данные перед тем, как направить пользователя на страницу редактирования.

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

Это шаблон, который я рекомендую, когда невозможно использовать 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()
4 голосов
/ 02 ноября 2011

Doh.Наконец-то разобрался.

createObject не , ни в каком реальном смысле, создает объект.На самом деле это просто URL-адрес для формы создания.

Позвоните .createObject(), получите URL-адрес формы, добавьте нужные значения в качестве параметров запроса:

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

сделает это.

...