Создание событий с помощью Plone Form Gen

Я пытаюсь создать тип содержимого Event, используя Plone Form Gen. Я использовал это руководство для того, чтобы сделать это.

При создании типа содержимого Event с помощью меню Add New... вам дают два поля для заполнения, которые являются датами начала и окончания события, и я хотел бы, чтобы моя форма извлекла информацию из этих полей и применила ее к тип содержимого события, который я использую для его создания.

Моя проблема, насколько я понимаю, описана с примерами ниже:

Пользовательский скрипт адаптера сценария содержит следующее:

obj.setDescription(form['replyto'])

Я вижу, что он получает содержимое для описания типа содержимого события из следующего:

<input id="replyto" class="" type="text" size="30" name="replyto" />

Поле даты / времени при добавлении в форму PFG состоит из нескольких <select> входы, а не только один, как указано выше, я думаю, это означает, что не просто obj.setEndDate() команда для этого... Хотя без возможности ссылаться на поля выбора я застрял.

Кто-нибудь знает, возможно ли создать тип контента Event и указать для него даты начала и окончания, используя Plone Form Gen?

редактировать

Используя эту ссылку, я обошел исходную проблему, но столкнулся с большим количеством проблем

Я адаптировал свой скрипт (используя ссылку выше), чтобы он выглядел следующим образом:

target = context.viewjobs

form = request.form

from DateTime import DateTime
uid = str(DateTime().millis())

loc = form['location-of-event']

target.invokeFactory("Event", id=uid, title=form['topic'], event_url=loc)

obj = target[uid]

obj.setFormat('text/plain')
obj.setText(form['comments'])
obj.setDescription(form['replyto'])

obj.reindexObject()

(Я использовал event_url просто для проверки, так как мне не повезло с event_start опция).

Это создает событие хорошо, но когда я иду, чтобы просмотреть событие, я получаю:

 Module zope.tales.expressions, line 217, in __call__
Module Products.PageTemplates.Expressions, line 147, in _eval
Module zope.tales.expressions, line 124, in _eval
Module Products.PageTemplates.Expressions, line 74, in boboAwareZopeTraverse
Module OFS.Traversable, line 317, in restrictedTraverse
Module OFS.Traversable, line 285, in unrestrictedTraverse
__traceback_info__: ([], 'location')

AttributeError: location

Я нигде не указывал местоположение в моем скрипте, и когда я это делаю, я получаю ту же ошибку.

Любые мысли будут оценены

2 ответа

Решение

Вы можете упростить свой код и избежать повторного вызова, выполнив что-то вроде этого:

target = context.viewjobs

form = request.form

from DateTime import DateTime
uid = str(DateTime().millis())

target.invokeFactory(
    "Event",
    id=uid,
    title=form['job-title'],
    description=form['description-1'],
    text=form['comments'],
    location=form['location-of-event'],
    startDate=form['start-date'],
    endDate=form['end-date-due-by']
    )

Что касается сбора даты начала и окончания. Если вы используете виджет Дата / Время и посмотрите на сгенерированный HTML, вы заметите, что есть скрытое поле ввода, имя которого совпадает с коротким именем виджета. Этот скрытый ввод содержит полное текстовое представление того, что было выбрано различными полями выбора, что дает вам возможность достичь желаемого с помощью текстового поля, но без необходимости полагаться на пользователя в использовании определенного формата.

Если вам интересно, как найти имена различных полей для указания в вызове invokeFactory, найдите файл python, который определяет тип контента, который вы пытаетесь создать. В случае объекта события это /Plone/buildout-cache/eggs/Products.ATContentTypes-2.1.8-py2.7.egg/Products/ATContentTypes/content/event.py

В строке 32 начинается "ATEventSchema = ...", и оттуда вы увидите имена полей для всех частей события.

Мне удалось решить эту проблему с помощью текстового поля и попросить пользователей ввести дату в следующем формате: 2013-12-12, затем я использовал obj.setStartDate(form['name-of-field']) а также obj.setEndDate(form['name-of-field']) установить это на Событии.

Чтобы обойти трассировку Location, я использовал obj.setLocation() и удалил строку местоположения из метода invoke, показанного в приведенном выше сценарии.

Скрипт для всех, кому интересно:

target = context.viewjobs

form = request.form

from DateTime import DateTime
uid = str(DateTime().millis())

target.invokeFactory("Event", id=uid, title=form['job-title'])

obj = target[uid]

obj.setFormat('text/plain')
obj.setText(form['comments'])
obj.setDescription(form['description-1'])
obj.setLocation(form['location-of-event'])
obj.setStartDate(form['start-date'])
obj.setEndDate(form['end-date-due-by'])

obj.reindexObject()
Другие вопросы по тегам