我在以编程方式创建Dexterity内容时遇到了这个问题,例如使用invokeFactory,而不是通过表单。基本上,模式中每个字段的默认值将是None而不是空字符串,空列表等。如果我想循环遍历schema.List字段中的所有值,我最终必须检查它是否是首先列出或冒险获取错误,具体取决于内容的创建方式。
我想知道是否可能缺少一些方法来处理所有字段以设置初始值(如果它们尚未定义)。也许invokeFactory不是首选方法?为创建的Dexterity内容设置初始值的事件监听器是不是很糟糕?
答案 0 :(得分:2)
您缺少的是每个基于敏捷的内容类型对其架构字段定义的default
属性。
请参阅Dexterity开发人员手册上的Field properties。
答案 1 :(得分:1)
尝试createObject或createContent,然后将对象添加到容器中。
这些都记录在敏捷手册参考部分的Manipulating content objects中。它包含所有导入和示例代码。
答案 2 :(得分:1)
经验教会我总是初始化我的模式,提交default
和missing_value
个可选参数,例如:
name = schema.TextLine(
title=u'Name',
default=u'',
missing_value=u'',
)
colors = schema.List(
title=_('Colors'),
value_type=schema.TextLine(),
default=[],
missing_value=[],
)
原因是当您以编程方式创建对象时需要default
(例如使用plone.api.content.create
)并且不初始化相关属性,而当您未通过时需要missing_value
z3c.form的任何值。