Skip to content

Commit 284f9fa

Browse files
committed
Correctly handle [] and {} as invalid inputs to BooleanField
1 parent a67eed1 commit 284f9fa

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

rest_framework/fields.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -608,10 +608,13 @@ def __init__(self, **kwargs):
608608
super(BooleanField, self).__init__(**kwargs)
609609

610610
def to_internal_value(self, data):
611-
if data in self.TRUE_VALUES:
612-
return True
613-
elif data in self.FALSE_VALUES:
614-
return False
611+
try:
612+
if data in self.TRUE_VALUES:
613+
return True
614+
elif data in self.FALSE_VALUES:
615+
return False
616+
except TypeError: # Input is an unhashable type
617+
pass
615618
self.fail('invalid', input=data)
616619

617620
def to_representation(self, value):

tests/test_fields.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,18 @@ class TestBooleanField(FieldValues):
466466
}
467467
field = serializers.BooleanField()
468468

469+
def test_disallow_unhashable_collection_types(self):
470+
inputs = (
471+
[],
472+
{},
473+
)
474+
field = serializers.BooleanField()
475+
for input_value in inputs:
476+
with pytest.raises(serializers.ValidationError) as exc_info:
477+
field.run_validation(input_value)
478+
expected = ['"{0}" is not a valid boolean.'.format(input_value)]
479+
assert exc_info.value.detail == expected
480+
469481

470482
class TestNullBooleanField(FieldValues):
471483
"""

0 commit comments

Comments
 (0)