Skip to content

Commit

Permalink
Support default values being used for empty HTML fields. Closes #3130.
Browse files Browse the repository at this point in the history
  • Loading branch information
tomchristie committed Jul 16, 2015
1 parent 7315ed8 commit d231f36
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 16 deletions.
2 changes: 2 additions & 0 deletions rest_framework/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,8 @@ def get_value(self, dictionary):
# 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
elif ret == '' and self.default:
return empty
return ret
return dictionary.get(self.field_name, empty)

Expand Down
47 changes: 31 additions & 16 deletions tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import django
import pytest
from django.http import QueryDict
from django.utils import timezone

import rest_framework
Expand Down Expand Up @@ -224,14 +225,6 @@ def test_invalid_error_key(self):
assert str(exc_info.value) == expected


class MockHTMLDict(dict):
"""
This class mocks up a dictionary like object, that behaves
as if it was returned for multipart or urlencoded data.
"""
getlist = None


class TestBooleanHTMLInput:
def setup(self):
class TestSerializer(serializers.Serializer):
Expand All @@ -245,7 +238,7 @@ def test_empty_html_checkbox(self):
"""
# This class mocks up a dictionary like object, that behaves
# as if it was returned for multipart or urlencoded data.
serializer = self.Serializer(data=MockHTMLDict())
serializer = self.Serializer(data=QueryDict(''))
assert serializer.is_valid()
assert serializer.validated_data == {'archived': False}

Expand All @@ -255,39 +248,63 @@ def test_empty_html_charfield(self):
class TestSerializer(serializers.Serializer):
message = serializers.CharField(default='happy')

serializer = TestSerializer(data=MockHTMLDict())
serializer = TestSerializer(data=QueryDict(''))
assert serializer.is_valid()
assert serializer.validated_data == {'message': 'happy'}

def test_empty_html_integerfield(self):
class TestSerializer(serializers.Serializer):
message = serializers.IntegerField(default=123)

serializer = TestSerializer(data=QueryDict('message='))
assert serializer.is_valid()
assert serializer.validated_data == {'message': 123}

def test_empty_html_uuidfield_with_default(self):
class TestSerializer(serializers.Serializer):
message = serializers.UUIDField(default=uuid.uuid4)

serializer = TestSerializer(data=QueryDict('message='))
assert serializer.is_valid()
assert list(serializer.validated_data.keys()) == ['message']

def test_empty_html_uuidfield_with_optional(self):
class TestSerializer(serializers.Serializer):
message = serializers.UUIDField(required=False)

serializer = TestSerializer(data=QueryDict('message='))
assert serializer.is_valid()
assert list(serializer.validated_data.keys()) == []

def test_empty_html_charfield_allow_null(self):
class TestSerializer(serializers.Serializer):
message = serializers.CharField(allow_null=True)

serializer = TestSerializer(data=MockHTMLDict({'message': ''}))
serializer = TestSerializer(data=QueryDict('message='))
assert serializer.is_valid()
assert serializer.validated_data == {'message': None}

def test_empty_html_datefield_allow_null(self):
class TestSerializer(serializers.Serializer):
expiry = serializers.DateField(allow_null=True)

serializer = TestSerializer(data=MockHTMLDict({'expiry': ''}))
serializer = TestSerializer(data=QueryDict('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):
message = serializers.CharField(allow_null=True, allow_blank=True)

serializer = TestSerializer(data=MockHTMLDict({'message': ''}))
serializer = TestSerializer(data=QueryDict('message='))
assert serializer.is_valid()
assert serializer.validated_data == {'message': ''}

def test_empty_html_charfield_required_false(self):
class TestSerializer(serializers.Serializer):
message = serializers.CharField(required=False)

serializer = TestSerializer(data=MockHTMLDict())
serializer = TestSerializer(data=QueryDict(''))
assert serializer.is_valid()
assert serializer.validated_data == {}

Expand Down Expand Up @@ -1116,8 +1133,6 @@ class TestMultipleChoiceField(FieldValues):
)

def test_against_partial_and_full_updates(self):
# serializer = self.Serializer(data=MockHTMLDict())
from django.http import QueryDict
field = serializers.MultipleChoiceField(choices=(('a', 'a'), ('b', 'b')))
field.partial = False
assert field.get_value(QueryDict({})) == []
Expand Down

0 comments on commit d231f36

Please sign in to comment.