1

他の1つのフィールドの値に応じて、多くのフィールドで必須フィールドの欠落エラーが発生するフォームを使用しています。

使用例:使用方法は、2つの配送モード(郵便または印刷)から選択する必要があります。郵便料金を選択しても住所に関するフィールドが入力されていない場合は、エラーを発生させたいと思います。

ここにいくつかのコードがあります

class ILivraisonForm(interface.Interface):
    livraison = schema.Choice(title=_(u"Mode de livraison"),
                              vocabulary=vocabulary.livraison)

    livraison_civility = schema.Choice(title=_(u"Civility (livraison)"),
                                       vocabulary=userdata.gender_vocabulary,
                                       required=False)
    livraison_name = schema.TextLine(title=_(u"Name (livraison)"),
                                        required=False)
    livraison_firstname = schema.TextLine(title=_(u"Firstname (livraison)"),
                                        required=False)
    livraison_add1 = schema.TextLine(title=_(u"Address line 1 (livraison)"),
                                        required=False)
    livraison_add2 = schema.TextLine(title=_(u"Address line 2 (livraison)"),
                                        required=False)
    livraison_pc = schema.TextLine(title=_(u"Postal code (livraison)"),
                                        required=False)
    livraison_city = schema.TextLine(title=_(u"City (livraison)"),
                                        required=False)

    livraison_phone = schema.TextLine(title=_(u"Phone"),
                                        required=False)

    accepted = schema.Bool(title=_(u"Accept CGV"),
                           description=_(u"Click here to read the CGV"),
                           required=True)


class LivraisonForm(form.Form):
    fields = field.Fields(ILivraisonForm)

    @button.buttonAndHandler(_(u"Valider"))
    def handleApply(self, action):
        data, errors = self.extractData()
        message = IStatusMessage(self.request)
        if errors:
            self.status = _(u"Please fix errors")
            return
        if not data['accepted']:
            self.status = _(u'You must accept')
            raise WidgetActionExecutionError('accepted',
                                     interface.Invalid(_(u'You must accept')))

        if data['livraison'] == 'mail' \
          and ( not data['livraison_name'] or not data['livraison_firstname'] \
          or not data['livraison_add1'] or not data['livraison_pc'] \
          or not data['livraison_city']):
            self.status = _(u'You must add your postal address')
            raise ???
4

1 に答える 1

1

何も上げる必要はありません。あなたがいる場所に権利のreturn代わりに追加するだけです。raise

さらに、zope.schema.ValidationErrorサブクラスを作成すると、アクションハンドラーの個々のウィジェットにエラーメッセージを設定できます。

from zope.schema import ValidationError

class AddressMissing(ValidationError):
    __doc__ = _(u'error_noaddress', u'Please provide an address')

次にハンドラーで:

from z3c.form.interfaces import IErrorViewSnippet
from zope import component

def handleApply(self, action):
    # ....

    widget = self.widgets['livraison_add1']
    error = component.getMultiAdapter(
        (AddressMissing(), self.request, widget, widget.field,
         self, self.context), interfaces.IErrorViewSnippet)
    error.update()
    widget.error = error

影響を受けるすべてのウィジェットに対してこれを行うことができます。

または、不変条件を使用してこれを処理することもできます。

from zope.interface import invariant, Invalid

class ILivraisonForm(interface.Interface):
    # ....

    @invariant
    def validatePostalAddress(data):
        if data.livraison. != 'mail':
            return
        for field in ('name', 'firstname', 'add1', 'pc', 'city'):
            if not data['livraison_' + field]:
                raise Invalid(_(u'error_noaddress', u'Please provide an address'))

を呼び出すとエラーが設定されますself.extractData()

于 2012-10-24T14:21:23.540 に答える