mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-23 01:57:00 +03:00
Merge pull request #2330 from tomchristie/better-blank-html-behavior
Better behavior with null and '' for blank HTML fields.
This commit is contained in:
commit
ffb8d568e0
|
@ -273,7 +273,11 @@ class Field(object):
|
||||||
return empty
|
return empty
|
||||||
return self.default_empty_html
|
return self.default_empty_html
|
||||||
ret = dictionary[self.field_name]
|
ret = dictionary[self.field_name]
|
||||||
return self.default_empty_html if (ret == '') else ret
|
if ret == '' and self.allow_null:
|
||||||
|
# If the field is blank, and null is a valid value then
|
||||||
|
# determine if we should use null instead.
|
||||||
|
return '' if getattr(self, 'allow_blank', False) else None
|
||||||
|
return ret
|
||||||
return dictionary.get(self.field_name, empty)
|
return dictionary.get(self.field_name, empty)
|
||||||
|
|
||||||
def get_attribute(self, instance):
|
def get_attribute(self, instance):
|
||||||
|
@ -545,8 +549,6 @@ class CharField(Field):
|
||||||
'min_length': _('Ensure this field has at least {min_length} characters.')
|
'min_length': _('Ensure this field has at least {min_length} characters.')
|
||||||
}
|
}
|
||||||
initial = ''
|
initial = ''
|
||||||
coerce_blank_to_null = False
|
|
||||||
default_empty_html = ''
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
self.allow_blank = kwargs.pop('allow_blank', False)
|
self.allow_blank = kwargs.pop('allow_blank', False)
|
||||||
|
@ -560,11 +562,6 @@ class CharField(Field):
|
||||||
message = self.error_messages['min_length'].format(min_length=min_length)
|
message = self.error_messages['min_length'].format(min_length=min_length)
|
||||||
self.validators.append(MinLengthValidator(min_length, message=message))
|
self.validators.append(MinLengthValidator(min_length, message=message))
|
||||||
|
|
||||||
if self.allow_null and (not self.allow_blank) and (self.default is empty):
|
|
||||||
# HTML input cannot represent `None` values, so we need to
|
|
||||||
# forcibly coerce empty HTML values to `None` if `allow_null=True`.
|
|
||||||
self.default_empty_html = None
|
|
||||||
|
|
||||||
def run_validation(self, data=empty):
|
def run_validation(self, data=empty):
|
||||||
# Test for the empty string here so that it does not get validated,
|
# Test for the empty string here so that it does not get validated,
|
||||||
# and so that subclasses do not need to handle it explicitly
|
# and so that subclasses do not need to handle it explicitly
|
||||||
|
|
|
@ -223,8 +223,8 @@ class MockHTMLDict(dict):
|
||||||
getlist = None
|
getlist = None
|
||||||
|
|
||||||
|
|
||||||
class TestCharHTMLInput:
|
class TestHTMLInput:
|
||||||
def test_empty_html_checkbox(self):
|
def test_empty_html_charfield(self):
|
||||||
class TestSerializer(serializers.Serializer):
|
class TestSerializer(serializers.Serializer):
|
||||||
message = serializers.CharField(default='happy')
|
message = serializers.CharField(default='happy')
|
||||||
|
|
||||||
|
@ -232,23 +232,31 @@ class TestCharHTMLInput:
|
||||||
assert serializer.is_valid()
|
assert serializer.is_valid()
|
||||||
assert serializer.validated_data == {'message': 'happy'}
|
assert serializer.validated_data == {'message': 'happy'}
|
||||||
|
|
||||||
def test_empty_html_checkbox_allow_null(self):
|
def test_empty_html_charfield_allow_null(self):
|
||||||
class TestSerializer(serializers.Serializer):
|
class TestSerializer(serializers.Serializer):
|
||||||
message = serializers.CharField(allow_null=True)
|
message = serializers.CharField(allow_null=True)
|
||||||
|
|
||||||
serializer = TestSerializer(data=MockHTMLDict())
|
serializer = TestSerializer(data=MockHTMLDict({'message': ''}))
|
||||||
assert serializer.is_valid()
|
assert serializer.is_valid()
|
||||||
assert serializer.validated_data == {'message': None}
|
assert serializer.validated_data == {'message': None}
|
||||||
|
|
||||||
def test_empty_html_checkbox_allow_null_allow_blank(self):
|
def test_empty_html_datefield_allow_null(self):
|
||||||
|
class TestSerializer(serializers.Serializer):
|
||||||
|
expiry = serializers.DateField(allow_null=True)
|
||||||
|
|
||||||
|
serializer = TestSerializer(data=MockHTMLDict({'expiry': ''}))
|
||||||
|
assert serializer.is_valid()
|
||||||
|
assert serializer.validated_data == {'expiry': None}
|
||||||
|
|
||||||
|
def test_empty_html_charfield_allow_null_allow_blank(self):
|
||||||
class TestSerializer(serializers.Serializer):
|
class TestSerializer(serializers.Serializer):
|
||||||
message = serializers.CharField(allow_null=True, allow_blank=True)
|
message = serializers.CharField(allow_null=True, allow_blank=True)
|
||||||
|
|
||||||
serializer = TestSerializer(data=MockHTMLDict({}))
|
serializer = TestSerializer(data=MockHTMLDict({'message': ''}))
|
||||||
assert serializer.is_valid()
|
assert serializer.is_valid()
|
||||||
assert serializer.validated_data == {'message': ''}
|
assert serializer.validated_data == {'message': ''}
|
||||||
|
|
||||||
def test_empty_html_required_false(self):
|
def test_empty_html_charfield_required_false(self):
|
||||||
class TestSerializer(serializers.Serializer):
|
class TestSerializer(serializers.Serializer):
|
||||||
message = serializers.CharField(required=False)
|
message = serializers.CharField(required=False)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user