Создание событий с помощью 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()