Skip to content

Commit be05a0c

Browse files
committed
fix: NoneOf and AnyOf can validate multiple valued fields like SelectMultipleField
1 parent 273d03b commit be05a0c

File tree

4 files changed

+37
-2
lines changed

4 files changed

+37
-2
lines changed

CHANGES.rst

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ Unreleased
1212
- Removed `required` flag support from :class:`~fields.HiddenWidget`,
1313
:class:`~fields.RangeWidget` and :class:`~fields.SelectWidget` to
1414
conform to W3C :pr:`810`
15+
- :class:`~wtforms.validators.NoneOf` and :class:`~wtforms.validators.AnyOf`
16+
can validate multiple valued fields like :class:`~fields.SelectMultipleField`
17+
:pr:`538` :pr:`807`
1518

1619
Version 3.1.2
1720
-------------

src/wtforms/validators.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,8 @@ def __init__(self, values, message=None, values_formatter=None):
586586
self.values_formatter = values_formatter
587587

588588
def __call__(self, form, field):
589-
if field.data in self.values:
589+
data = field.data if isinstance(field.data, list) else [field.data]
590+
if any(d in self.values for d in data):
590591
return
591592

592593
message = self.message
@@ -621,7 +622,8 @@ def __init__(self, values, message=None, values_formatter=None):
621622
self.values_formatter = values_formatter
622623

623624
def __call__(self, form, field):
624-
if field.data not in self.values:
625+
data = field.data if isinstance(field.data, list) else [field.data]
626+
if not any(d in self.values for d in data):
625627
return
626628

627629
message = self.message

tests/validators/test_anyof.py

+15
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,18 @@ def formatter(values):
3939
validator(dummy_form, dummy_field)
4040

4141
assert str(e.value) == "test 9::8::7"
42+
43+
44+
def test_none_multiple_values(dummy_form, dummy_field):
45+
"""
46+
the validator should work with multiple values like produced
47+
by SelectMultiple fields
48+
"""
49+
dummy_field.data = ["a", "e"]
50+
validator = AnyOf(["a", "b", "c"])
51+
validator(dummy_form, dummy_field)
52+
53+
dummy_field.data = ["d", "e"]
54+
validator = AnyOf(["a", "b", "c"])
55+
with pytest.raises(ValueError):
56+
validator(dummy_form, dummy_field)

tests/validators/test_noneof.py

+15
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,18 @@ def test_none_of_raises(dummy_form, dummy_field):
2020
validator = NoneOf(["a", "b", "c"])
2121
with pytest.raises(ValueError):
2222
validator(dummy_form, dummy_field)
23+
24+
25+
def test_none_of_multiple_values(dummy_form, dummy_field):
26+
"""
27+
the validator should work with multiple values like produced
28+
by SelectMultiple fields
29+
"""
30+
dummy_field.data = ["d", "e"]
31+
validator = NoneOf(["a", "b", "c"])
32+
validator(dummy_form, dummy_field)
33+
34+
dummy_field.data = ["a", "e"]
35+
validator = NoneOf(["a", "b", "c"])
36+
with pytest.raises(ValueError):
37+
validator(dummy_form, dummy_field)

0 commit comments

Comments
 (0)