Pytanie Jak mogę zwalidować pola wtforms względem siebie?


Mam trzy identyczne SelectField dane wejściowe w formularzu, każdy z tym samym zestawem opcji. Nie mogę użyć jednego wyboru wielokrotnego.

Chcę się upewnić, że użytkownik wybiera trzy różne opcje dla tych trzech pól.

W przypadku sprawdzania poprawności niestandardowej okazuje się, że można odwoływać się tylko do jednego pola naraz, a nie porównywać wartości tego pola z innymi. Jak mogę to zrobić? Dzięki!


14
2018-02-16 17:52


pochodzenie




Odpowiedzi:


Możesz przesłonić validate w Twoim 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

22
2018-02-16 18:00



Dzięki - dlaczego linia if not Form.validate(self):? To trwa, gdy próbuję twojej sugestii, a sprawdzanie poprawności nie działa. - YPCrumble
To robi domyślną walidację (tak jakbyś nie zastąpiła sprawdzania poprawności) - FogleBird
Inne kroki mają na celu sprawdzenie poprawności w wielu polach, o które prosiłeś. - FogleBird
Chcę tylko dodać, że byłem zdezorientowany przez przejęcie tutaj. Odwołując się do O'Reilly Learning Python, nazwałbym to rozszerzeniem metody sprawdzania poprawności. Ponieważ nadal wywołujesz domyślne zachowanie podczas połączenia if not Form.validate(self) Następnie uruchamiany jest niestandardowy kod sprawdzania poprawności. Kiedy to przeczytałem, wyjaśniło mi to wszystko. Wciąż @FogleBird świetna odpowiedź - Jimmy
Jeśli używasz Pythona 3, lepiej pisać super().validate() niż Form.validate(self). Jeśli używasz Pythona 2, użyj super(MyForm, self).validate(). - Dan Passaro


Napisałem małą bibliotekę Pythona wymagany aby ułatwić walidację między polami. Możesz deklarować deklaratywnie logikę walidacji jako zależności parami. Twoja forma może wyglądać tak:

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

Możesz wziąć obiekt VALIDATION i dołączyć więcej reguł sprawdzania poprawności, a nawet umieścić go w osobnym module i zaimportować / ponownie użyć reguł sprawdzania poprawności w różnych miejscach.


1
2018-02-02 17:10