我有一个 Dexterity 内容类型,基于plone.directives.form.Schema
它有许多用于分配默认值的表单提示:
@form.default_value(field=ITrial['start_on'])
def default_start_on(data):
return datetime.now()
一些默认值更复杂,传回本身就是 Dexterity 类型实例的对象。这些对象对于主要类型的设置至关重要,主要类型由各种事件触发。
我现在正在测试中。理想情况下,我希望能够使用类似的东西:
item = createContentInContainer(folder, 'ctcc.model.trial', 'item')
也就是说,我希望项目能够获取默认值,而不必手动传递给构造函数。
如果我正在使用,zope.schema
我可以使用 FieldProperty 来设置模式字段的代理。是否有与 Dexterity 等效的东西,或者可能是通过创建表单来推送对象的功能?
解决方案:我最终选择了 David 的选项 #1,拦截ObjectCreatedEvent
.
@grok.subscribe(ITrial, IObjectCreatedEvent)
def create_trial(trial, event):
if getattr(trial, 'start_on', None) is None:
trial.start_on = default_start_on(None)
感觉就像我在复制表单行为的一部分,但至少它使用的是提供表单默认值的相同功能。