0

plone.directives.form.Schema; から派生したコンテンツ タイプがあります。4 つのフィールドセットにまたがる数十のフィールドがあります。2 つの異なるフィールドセットのフィールドを見る zope.interface.invariant を作成しようとしています。

動作を追跡すると、フォーム全体ではなく、フィールドセットごとに不変式が 1 回呼び出されるように見えます。

独自のハンドラーを提供し、そこで必要なすべてのチェックを実行できることは承知していますが、明確に定義された不変条件と比較すると分厚いと感じます。明らかな解決策は、関連するフィールドを同じフィールドセットに移動することですが、現在のセットアップはエンド ユーザーにとって論理的なレイアウトを反映しています。

フィールドセット全体で複数のフィールドに対して検証を実行できる既存のフックはありますか?

4

1 に答える 1

1

答えはノーのようです:グループ/フィールドセットごとに 1 回z3c.form.group.Group.extractData呼び出し、この呼び出しには既に不変の検証が含まれています。z3c.form.form.BaseForm.extractData

独自のhandlerを登録する代わりに、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

このクラスは、form.SchemaForm ではなく、Dexterity のデフォルト ハンドラを含む dexterity.EditForm から派生することに注意してください。

WidgetActionExecutionErrorただし、確実には機能しません。一部のフィールドでは、「KeyError」が生成されます。

于 2012-11-25T21:56:03.840 に答える