Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion rest_framework/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -661,7 +661,8 @@ class CharField(Field):
default_error_messages = {
'blank': _('This field may not be blank.'),
'max_length': _('Ensure this field has no more than {max_length} characters.'),
'min_length': _('Ensure this field has at least {min_length} characters.')
'min_length': _('Ensure this field has at least {min_length} characters.'),
'invalid': _('{input} is not a valid string.'),
}
initial = ''

Expand All @@ -686,6 +687,9 @@ def run_validation(self, data=empty):
if not self.allow_blank:
self.fail('blank')
return ''
if not isinstance(data, (six.text_type, six.binary_type, type(None))):
if data is not empty:
self.fail('invalid', input=data)
return super(CharField, self).run_validation(data)

def to_internal_value(self, data):
Expand Down
18 changes: 17 additions & 1 deletion tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -501,10 +501,11 @@ class TestCharField(FieldValues):
Valid and invalid values for `CharField`.
"""
valid_inputs = {
1: '1',
'abc': 'abc'
}
invalid_inputs = {
1: ['1 is not a valid string.'],
42.0: ['42.0 is not a valid string.'],
'': ['This field may not be blank.']
}
outputs = {
Expand All @@ -528,6 +529,21 @@ def test_disallow_blank_with_trim_whitespace(self):
field.run_validation(' ')
assert exc_info.value.detail == ['This field may not be blank.']

def test_collection_types_are_invalid_input(self):
field = serializers.CharField()
input_values = (
42,
{},
[],
tuple(),
set(),
)
for value in input_values:
with pytest.raises(serializers.ValidationError) as exc_info:
field.run_validation(value)
expected = ['{0} is not a valid string.'.format(value)]
assert exc_info.value.detail == expected


class TestEmailField(FieldValues):
"""
Expand Down