Plone 设置以编程方式创建的灵活性项的字段默认值

Plone 设置以编程方式创建的灵活性项的字段默认值,plone,dexterity,Plone,Dexterity,我有一个基于plone.directions.form.Schema的灵巧内容类型,它有许多用于指定默认值的表单提示: @form.default\u值(field=ITrial['start\u on']) def def default_start_on(数据): return datetime.now() 有些默认设置更为复杂,会传回本身就是灵巧类型实例的对象。这些对象对于由各种事件触发的主类型设置至关重要 我现在正在测试。理想情况下,我希望能够使用以下内容: item=createCo

我有一个基于
plone.directions.form.Schema
的灵巧内容类型,它有许多用于指定默认值的表单提示:

@form.default\u值(field=ITrial['start\u on'])
def def default_start_on(数据):
return datetime.now()
有些默认设置更为复杂,会传回本身就是灵巧类型实例的对象。这些对象对于由各种事件触发的主类型设置至关重要

我现在正在测试。理想情况下,我希望能够使用以下内容:

item=createContentInContainer(文件夹'ctcc.model.trial','item')
也就是说,我希望默认值由项拾取,而不必手动传递到构造函数中

如果我使用的是
zope.schema
,我可以使用FieldProperty设置模式字段的代理。是否有灵巧性的等价物,或者是推动对象通过表单创建的功能

解决方案:我最终选择了大卫的选项#1,拦截
ObjectCreatedEvent

@grok.subscribe(ITrial,IObjectCreatedEvent)
def创建_试验(试验、事件):
如果getattr(试用版,“启动”,无)为无:
trial.start\u on=默认启动(无)

它仍然感觉我在复制表单行为的一部分,但至少它使用的函数与提供表单默认值的函数相同。

正如您所发现的,z3c.form表单尊重@form.default\u值装饰器,但在以其他方式创建项时不尊重它。您有几个选择:

  • 为内容类型的ObjectCreatedEvent编写一个处理程序,用于设置必要的默认值。这是最简单的实现方法,但如果此事件的其他处理程序需要适当的值,则可能不起作用

  • 创建您自己的Dextrity的泛型Item类的子类,并使用它而不是Item作为内容类型的基础。然后,您可以自定义
    \uuuu init\uuu
    方法来设置您想要的任何内容。但是,如果您已经有了一些内容项,那么这将需要迁移现有的内容项

  • 这是一个更复杂的选择。替换用于构造内容类型的factory实用程序。createContentInContainer最终会查找名称等于内容类型FTI的factory属性的IFactory实用程序。默认实现是在
    plone.dextrity.factory
    中,但是您可以用另一个实现更多功能的实现来替换它


  • 谢谢你的建议,我现在正在研究。然而,我真的在努力避免在两个地方进行设置:我需要
    默认值
    装饰器将正确的值传递到表单中……在其他地方连接相同的行为对我来说就像是双重接触问题。我所希望的是一种更类似于从模式生成表单的方法,然后使用
    z3c.form.form.applyChanges
    设置默认值,但我不确定这是否是一种可行的方法。