2014-02-16 9 views
14

Ich habe drei identische SelectField Eingänge in einer Form, jedes mit dem gleichen Satz von Optionen. Ich kann keine Mehrfachauswahl verwenden.Wie validiere ich wtforms Felder gegeneinander?

Ich möchte sicherstellen, dass der Benutzer drei verschiedene Auswahlmöglichkeiten für diese drei Felder auswählt.

Bei der benutzerdefinierten Überprüfung scheint es, dass Sie nur ein Feld zu einem Zeitpunkt referenzieren können, vergleichen Sie nicht den Wert dieses Felds mit anderen. Wie kann ich das machen? Vielen Dank!

Antwort

21

Sie können validate in Ihrem Form außer Kraft setzen ...

class MyForm(Form): 
    select1 = SelectField('Select 1', ...) 
    select2 = SelectField('Select 2', ...) 
    select3 = SelectField('Select 3', ...) 
    def validate(self): 
     if not Form.validate(self): 
      return False 
     result = True 
     seen = set() 
     for field in [self.select1, self.select2, self.select3]: 
      if field.data in seen: 
       field.errors.append('Please select three distinct choices.') 
       result = False 
      else: 
       seen.add(field.data) 
     return result 
+0

Danke - warum die Zeile 'wenn nicht Form.validate (self):'? Das schießt weiter, wenn ich deinen Vorschlag versuche und die Validierung nicht läuft. – YPCrumble

+0

Das ist die Standardvalidierung (als ob Sie die Validierung nicht überschrieben hätten) – FogleBird

+0

Die anderen Schritte sind die Validierung über mehrere Felder, wie Sie gefragt haben. – FogleBird

0

ich eine kleine Python-Bibliothek required Querfeldvalidierung wie diese leichter zu machen geschrieben. Sie können Ihre Validierungslogik deklarativ als paarweise Abhängigkeiten codieren. So können Sie Ihre Form wie folgt aussehen:

from required import R, Requires, RequirementError 

class MyForm(Form): 

    VALIDATION = (
     Requires("select1", R("select1") != R("select2") + 
     Requires("select2", R("select2") != R("select3") + 
     Requires("select3", R("select3") != R("select1") 
    ) 

    select1 = SelectField('Select 1', ...) 
    select2 = SelectField('Select 2', ...) 
    select3 = SelectField('Select 3', ...) 

    def validate(self): 
     data = { 
      "select1": self.select1.data, 
      "select2": self.select2.data, 
      "select3": self.select3.data, 
     } 

     # you can catch the RequirementError 
     # and append the error message to 
     # the form errors 

     self.VALIDATION.validate(data) 
     return result 

Sie das Validierungs-Objekt nehmen und mehr Validierungsregeln anhängen oder es sogar setzen in einem separaten Modul und Import/Wiederverwendung Validierungsregeln in verschiedenen Orten.