我有一个源自plone.directives.form.Schema的内容类型;它有四个字段集中的几十个字段。我正在尝试创建一个zope.interface.invariant,它查看来自两个不同字段集的字段。
通过跟踪行为,看起来为每个字段集调用一次invariant,而不是整个表单。
我知道我可以提供自己的处理程序并执行我需要的所有检查,但与明确定义的不变量相比,这感觉很粗糙。虽然显而易见的解决方案是将相关字段移动到同一字段集上,但当前设置反映了最终用户逻辑的布局。
是否存在可以在跨字段集的多个字段上执行验证的现有挂钩?
答案 0 :(得分: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,其中包含Dexterity的默认处理程序,而不是form.SchemaForm。
但是, WidgetActionExecutionError
无法可靠地运行。对于某些字段,它会产生“KeyError”。