2012-05-02 39 views
0

我已经从plone.directives.form.Schema得出的内容类型;它有四个字段集中的几十个字段。我试图创建一个zope.interface.invariant,查看来自两个不同字段集的字段。使用不变的敏捷形式和字段集

从跟踪行为看,它看起来像不变是每字段集调用,但不是整个表单。

我知道我可以提供我自己的处理程序,并执行我需要在那里的所有检查,但相比明确定义不变,感觉矮胖。虽然明显的解决方案是将相关字段移动到相同的字段集,但当前的设置反映了最终用户逻辑的布局。

有一个现有的钩在那里我可以跨字段集多个字段进行验证?

回答

1

答案似乎是:z3c.form.group.Group.extractData调用z3c.form.form.BaseForm.extractData一次为每个组/字段集,并且此调用已包含不变验证。

不是注册自己处理的,你也可以覆盖ExtractData由

from plone.directives import form, dexterity 
from z3c.form.interfaces import ActionExecutionError,WidgetActionExecutionError 
# ... 

class EditForm(dexterity.EditForm): 
    grok.context(IMyEvent) 

    def extractData(self, setErrors=True): 
    data, errors = super(EditForm, self).extractData(setErrors) 

    if not None in(data['start'], data['end']): 
     if data['end'] < data['start']: 
     raise WidgetActionExecutionError('end', Invalid(_(u"End date should not lie before the start date."))) 
     if data['end'] - data['start'] > datetime.timedelta(days=7): 
     raise WidgetActionExecutionError('end', Invalid(_(u"Duration of convention should be shorter than seven (7) days."))) 

    return data, errors 

请注意,这个类从dexterity.EditForm,其中包括敏捷的默认处理程序,而不是form.SchemaForm派生。

WidgetActionExecutionError不正常,虽然。对于某些领域,它会产生一个'KeyError'。