2014-02-16 4 views
14

У меня есть три идентичных входа SelectField в форме, каждая с тем же набором опций. Я не могу использовать один множественный выбор.Как проверить поля wtforms друг против друга?

Я хочу, чтобы пользователь выбирал три разных варианта для этих трех полей.

В пользовательской проверке кажется, что вы можете ссылаться только на одно поле за раз, а не сравнивать значение этого поля с другими. Как я могу это сделать? Благодаря!

ответ

21

Вы можете переопределить validate в вашем Form ...

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

Спасибо - почему строка 'if not Form.validate (self):'? Это держит стрельбу, когда я пробую ваше предложение, и проверка не выполняется. – YPCrumble

+0

Это делается для проверки по умолчанию (как если бы вы не переопределили проверку) – FogleBird

+0

Другие шаги - выполнить проверку по нескольким полям, как вы просили. – FogleBird

0

Я написал небольшую питона библиотеку required сделать проверку кросс-поля, как это проще. Вы можете кодировать логику проверки декларативно как попарные зависимости. Так что ваша форма может выглядеть следующим образом:

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 

Вы можете взять объект ВАЛИДАЦИИ и добавить дополнительные правила проверки или даже поместить его в отдельный модуль и правила проверки импорта/повторного использования в разных местах.

Смежные вопросы