我正在尝试使用Plone Form Gen. I have been using this tutorial创建一个事件内容类型,以便执行此操作。
使用添加新... 菜单创建活动内容类型时,您将获得两个要填写的字段:开始和结束事件的日期,我希望我的表单从这些字段中提取信息并将其应用于我用来创建它的事件内容类型。
我理解的问题用以下示例描述:
自定义脚本适配器脚本包含以下内容:
obj.setDescription(form['replyto'])
我可以看到它从以下内容获取了事件内容类型描述的内容:
<input id="replyto" class="" type="text" size="30" name="replyto" />
添加到PFG表单时的日期/时间字段由多个<select>
输入组成,而不仅仅是上面的一个,我想这意味着没有简单的obj.setEndDate()
命令为此...虽然没有办法参考选择框我有点卡住了。
是否有人知道是否可以使用Plone Form Gen创建事件内容类型并在其上指定开始日期和结束日期?
Using this link我已经解决了原始问题,但我遇到了更多问题
我已经调整了我的脚本(使用上面的链接),如下所示:
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
我没有在我的脚本中的任何位置引用位置,当我这样做时,我得到了同样的错误。
任何想法都将不胜感激
答案 0 :(得分:5)
您可以通过执行以下操作来简化代码并避免重新索引:
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 = ...”,然后你会看到事件所有部分的字段名称。
答案 1 :(得分:1)
我设法通过使用文本字段并要求用户以此格式输入日期来解决此问题:2013-12-12,然后我使用obj.setStartDate(form['name-of-field'])
和obj.setEndDate(form['name-of-field'])
来设置事件
为了解决位置追踪问题,我使用了obj.setLocation()
并从上面脚本中显示的调用方法中删除了位置线。
任何有兴趣的人的剧本:
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()