我们有一个基于灵活性的内容类型,它必须从其父字段继承字段的默认值。我们使用以下代码:
在模型中:
<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'>我该如何解决这个问题呢?
发布于 2016-04-05 19:00:38
你做的每件事都是正确的。在代码中,您尝试像这样访问主题:
>>> object.subjects如果从未设置过subjects,则Dexterity的__getattr__实现将开始其工作。这种缺失属性的__getattr__魔术是由Python实现的。它以某种方式松开了获取包装。松开获取包装器后,aq_parent和父都无法继续工作。在我的测试中,我能够通过调用
>>> object.__getattr__('subjects')但这并不令人满意。
在视图代码中,您没有这个问题,因为视图根本不通过object.subjects访问属性,因此获取上下文永远不会丢失。
我将在这里完成我的分析,但我在plone.dexterity的bugreport中记录了我的发现。也许您想在那里提供一个最小的测试:https://github.com/plone/plone.dexterity/issues/53
https://stackoverflow.com/questions/35799092
复制相似问题