Validazione Multicampo con z3c.form 2.1

18 settembre 2009

La mia form “esemplificativa” è costituita da tre campi, questa interfaccia ne descrive lo schema:

from zope.interface import Interface
from zope import schema

class IUserIdentification(Interface):
 
  field1 = schema.TextLine(title = u"First Field")
  field2 = schema.TextLine(title = u"Second Field", required = False)  
  field3 = schema.TextLine(title = u"Third Field", required = False)

La mia esigenza: il secondo e terzo campo (field2, field3) risultano obbligatori solo se il primo campo (field1) è valorizzato.


Tra i vari modi di risolverlo scelgo di gestirlo con un Invariant applicato allo schema descritto dalla mia interfaccia. Nell’invariant piazzo le logiche per captare l’errore e restituirlo:

  from zope.interface import invariant

  @invariant
  def validateMailUsercode(data):
    if data.field1 is None:
      return
    if data.field2 is None:
      raise MyInvalid('field2',_(u"Please fill in field2."))
    if data.field3 is None:
      raise MyInvalid('field3',_(u"Please fill in field3."))

Non resta che andare a definire la nostra class MyInvalid:

  from zope.interface import Invalid

  class MyInvalid(Invalid):
 
    def __init__(self, field_name, message):
      self.field_name = field_name
      self.message = message
 
    def doc(self):
      return self.message

Il tocco finale consiste nel fornire lo snippet per renderizzare l’errore a video, un adattatore che adatta il nostro errore:

  from z3c.form import error
  from zope.component import provideAdapter, adapts

  class MyInvalidView(error.ErrorViewSnippet):
 
    adapts(MyInvalid, None, None, None, None, None)
 
    def update(self):
      super(MyInvalidView, self).update()
      self.message = self.error.message
      self.form.widgets[self.error.field_name].error = self
 
  provideAdapter(MyInvalidView)

fatto.. 🙂


					
Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: