2009-07-15 14 views
0

Problem:Kette FormEncode Validatoren

Ich habe ein Formular in Turbogears 2, die ein Textfeld für eine Liste von E-Mails hat. Gibt es eine einfache Möglichkeit, ToscaWidgets oder FormEncode zu verwenden, um Validatoren für Set und Email zu verketten oder muss ich meinen eigenen Validator dafür schreiben?

Antwort

0

Ich denke, es sollte mehr wie folgt sein. Es hat den Vorteil, jede E-Mail zu testen, anstatt nur beim ersten ungültigen anzuhalten. Es fügt dem Zustand auch die Fehler hinzu, so dass Sie sagen konnten, welche fehlgeschlagen waren.

from formencode import FancyValidator, Invalid 
from formencode.validators import Email 

class EmailList(FancyValidator): 
    """ Takes a delimited (default is comma) string and returns a list of validated e-mails 
     Set the delimiter by passing delimiter="A_DELIMITER" to the constructor. 
     Also takes all arguments a FancyValidator does. 
     The e-mails will always be stripped of whitespace. 
    """ 
    def _to_python(self, value, state): 
     try: 
      values = str(value).split(self.delimiter) 
     except AttributeError: 
      values = str(value).split(',') 
     validator = formencode.ForEach(validators.Email()) 
     validator.to_python(values, state) 
     return [value.strip() for value in values] 
+0

Interessant, wie ich das Upgrade. – Robbie

+0

Allerdings sollte Zeile 13 wieder Werte zuweisen: Werte = validator.to_python (Werte, Zustand) – Robbie

0

Was ich wollte, war ein Validator, den ich einfach in ein Feld wie die String und Int Validatoren stecken könnte. Ich fand, dass es keinen Weg gab, dies zu tun, wenn ich nicht meinen eigenen Validator erstellte. Ich poste es hier der Vollständigkeit halber, und so können andere davon profitieren.

from formencode import FancyValidator, Invalid 
from formencode.validators import Email 

class EmailList(FancyValidator): 
    """ Takes a delimited (default is comma) string and returns a list of validated e-mails 
     Set the delimiter by passing delimiter="A_DELIMITER" to the constructor. 
     Also takes all arguments a FancyValidator does. 
     The e-mails will always be stripped of whitespace. 
    """ 
    def _to_python(self, value, state): 
     try: 
      values = str(value).split(self.delimiter) 
     except AttributeError: 
      values = str(value).split(',') 
     returnValues = [] 
     emailValidator = Email() 
     for value in values: 
      returnValues.append(emailValidator._to_python(value.strip(), state)) 
     return values 
1

von http://formencode.org/Validator.html

Ein weiterer bemerkenswerter Validator ist formencode.compound.All - das ist eine Verbindung Validator - das heißt, es ist ein Validator ist, die Validatoren als Eingabe verwendet. Schemas sind ein Beispiel; In diesem Fall nimmt All eine Liste von Validatoren und wendet diese nacheinander an. formencode.compound.Any ist sein Kompliment, das den ersten gültigen Validator in seiner Liste verwendet.

0

Mit FormEncode validators - Rohr und Wrapper, könnten Sie:

from formencode import validators, compound 


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')), 
       validators.Email())