2016-07-20 21 views
1
class ContactForm(Form): 
    name = StringField('Name', 
        validators=[DataRequired(), Length(max=255)]) 
    email = StringField('Email', 
         validators=[Optional(), Email(), Length(max=255)]) 
    phone = StringField('Phone number', 
         validators=[Optional(), NumberRange(min=8, max=14)]) 
    comment = TextAreaField(u'Comment', 
          validators=[DataRequired()]) 

Gibt es trotzdem einen Validator anzugeben, so dass entweder email oder phone erforderlich ist?WTForm "OR" bedingter Validator? (Entweder E-Mail oder Telefon)

+0

können eine benutzerdefinierte erstellen 'bestätigen()' Methode und prüfen, ob man dort ist. – reptilicus

Antwort

1

Sie können eine validate Methode auf dem Formular erstellen und einige manuelle Überprüfung durchführen. So etwas könnte dich beginnen.

class MyForm(Form): 
    name = StringField('Name', 
       validators=[DataRequired(), Length(max=255)]) 
    email = StringField('Email', 
         validators=[Optional(), Email(), Length(max=255)]) 
    phone = StringField('Phone number', 
         validators=[Optional(), NumberRange(min=8, max=14)]) 
    comment = TextAreaField(u'Comment', 
          validators=[DataRequired()]) 
    def validate(self): 
     valid = True 
     if not Form.validate(self): 
      valid = False 
     if not self.email and not self.phone: 
      self.email.errors.append("Email or phone required") 
      valid = False 
     else: 
      return valid 
+0

Das funktioniert. Ich stelle fest, dass die zweite if-Klausel nicht ausgelöst wird, wenn die anderen Felder fehlschlagen. Gibt es eine Möglichkeit, die Überprüfung von self.email.data oder self.phone.data während Form.validate auszulösen? – Sparrowcide

+0

Editiert es ein bisschen, sehen, ob das funktioniert. Wenn ja, bitte akzeptieren Sie die Antwort, damit zukünftige Leser davon profitieren können. – reptilicus

1

Vielen Dank @Reptilicus. Ich hatte kleine Änderungen an der Antwort, damit es funktioniert.

  1. Mußten für Datenfeld am Ende der validate() Methode statt else Bedingung gültig mußte überprüfen self.email.data and self.phone.data
  2. Auch zurückzukehren.
def validate(self): 
    valid = True 
    if not Form.validate(self): 
     valid = False 
    if not self.email and not self.phone: 
     self.email.errors.append("Email or phone required") 
     valid = False 
    return valid