我正在使用 Plone 4.3,并且我有一个 form.SchemaForm plone.directives 有一个接口,该接口有一个来自 IEventBasic 的起始字段和一个验证器:
from datetime import timedelta
from plone.directives import form
from plone.app.contenttypes.interfaces import IEvent
from z3c.form import validator
from zope.component import provideAdapter
from zope.interface import Invalid
class IMyObject(form.SchemaForm)
my_field_a = schema.TextLine(title='a_field')
...
class MyObject(Item):
implements(IMyObject, IEvent)
class EndMyObjectValidator(validator.SimpleFieldValidator):
def validate(self,value):
#code for checking if end field is within a certain range from start field
if self.end > self.start + timedelta(days=6):
raise Invalid('The end date is not within range of the start date's week')
validator.WidgetValueDiscriminators(EndMyObjectValidator, field=IEventBasic['end'])
provideAdapter(EndMyObjectValidator)
在我的类型文件(profiles/default/types 下的 my.object.myobject.xml)中,我将行为放在了行为部分中。
<behaviors>
<element value="plone.app.event.dx.behaviors.IEventBasic"/>
</behaviors>
问题是它验证任何 Event 对象或任何实现 IEventBasic 接口/模式的对象中的 end 字段。
我想也许是因为 Plone 文档说 WidgetValueDiscriminators 的参数“视图”和“上下文”接受一个接口,那么我可以这样做:
validator.WidgetValidatorDiscriminators(EndMyObjectValidator, view=IMyObject, field=IEventBasic['end'])
或者
validator.WidgetValidatorDiscriminators(EndMyObjectValidator, context=IMyObject,field=IEventBasic['end']
不幸的是,这些都没有触发。我想我误解了上下文和视图参数的实际作用。我怎样才能使验证器专门用于处理 MyObject?
现在我正在做:
...
from gpcl.container.my_container import MyContainer
...
class EndMyObjectValidator(validator.SimpleFieldValidator):
def validate(self,value):
if self.widgets.form.portal_type <> 'my.object.myobject':
return
...
validator.WidgetValueDiscriminators(EndMyObjectValidator, field=IEventBasic['end'])
provideAdapter(EndMyObjectValidator)
更新 2:我之前删除了我的评论,因为它是针对一个不相关的问题。我改变了检查类型的方式。