0

我有一个从 plone.directives.form.Schema 派生的内容类型;它在四个字段集中有几十个字段。我正在尝试创建一个 zope.interface.invariant 来查看来自两个不同字段集的字段。

从跟踪行为来看,似乎每个字段集都调用了一次不变量,而不是整个表单。

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

是否有一个现有的钩子,我可以在其中跨字段集对多个字段执行验证?

4

1 回答 1

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”。

于 2012-11-25T21:56:03.840 回答