0

我们有一个基于 Dexterity 的内容类型,它必须从其父字段继承字段的默认值。我们使用以下内容:

在模型中:

<model xmlns="http://namespaces.plone.org/supermodel/schema"
       xmlns:indexer="http://namespaces.plone.org/supermodel/indexer"
       xmlns:form="http://namespaces.plone.org/supermodel/form">
  <schema>
    ...
    <field name="subjects" type="zope.schema.Tuple" indexer:searchable="true">
      ...
      <defaultFactory>my.package.content.default_subjects</defaultFactory>
      ...
    </field>
  </schema>
</model>

工厂声明如下:

from zope.schema.interfaces import IContextAwareDefaultFactory
...
@provider(IContextAwareDefaultFactory)
def default_subjects(context):
    return getattr(context, 'subjects', ())

这在运行实例时工作正常:

(Pdb) context
<MyType at /Plone/folder>
(Pdb) type(context)
<type 'Acquisition.ImplicitAcquisitionWrapper'>

但是在运行测试时失败,因为没有包装上下文:

(Pdb) context
<MyType at test>
(Pdb) type(context)
<class 'my.package.content.MyType'>

我该如何解决这个问题?

4

1 回答 1

1

你做的一切都是正确的。在代码中,您尝试访问这样的主题:

>>> object.subjects

subjects从未设置时,__getattr__Dexterity 的实现开始工作。这种__getattr__缺失属性的魔法是由 Python 实现的。它以某种方式丢失了采集包装。丢失获取包装器后,aq_parent 和parent都不会继续工作。在我的测试中,我能够通过调用来规避这个问题

>>> object.__getattr__('subjects')

但这并不令人满意。

在视图代码中你没有这个问题,因为视图根本不访问属性object.subjects,所以获取上下文永远不会丢失。

我将在这里完成我的分析,但我在 plone.dexterity 的错误报告中记录了我的发现。也许你想在那里提供一个最小的测试: https ://github.com/plone/plone.dexterity/issues/53

于 2016-04-05T11:00:38.203 回答