Skip to content

Commit d231f36

Browse files
committed
Support default values being used for empty HTML fields. Closes #3130.
1 parent 7315ed8 commit d231f36

File tree

2 files changed

+33
-16
lines changed

2 files changed

+33
-16
lines changed

rest_framework/fields.py

+2
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ def get_value(self, dictionary):
291291
# If the field is blank, and null is a valid value then
292292
# determine if we should use null instead.
293293
return '' if getattr(self, 'allow_blank', False) else None
294+
elif ret == '' and self.default:
295+
return empty
294296
return ret
295297
return dictionary.get(self.field_name, empty)
296298

tests/test_fields.py

+31-16
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import django
66
import pytest
7+
from django.http import QueryDict
78
from django.utils import timezone
89

910
import rest_framework
@@ -224,14 +225,6 @@ def test_invalid_error_key(self):
224225
assert str(exc_info.value) == expected
225226

226227

227-
class MockHTMLDict(dict):
228-
"""
229-
This class mocks up a dictionary like object, that behaves
230-
as if it was returned for multipart or urlencoded data.
231-
"""
232-
getlist = None
233-
234-
235228
class TestBooleanHTMLInput:
236229
def setup(self):
237230
class TestSerializer(serializers.Serializer):
@@ -245,7 +238,7 @@ def test_empty_html_checkbox(self):
245238
"""
246239
# This class mocks up a dictionary like object, that behaves
247240
# as if it was returned for multipart or urlencoded data.
248-
serializer = self.Serializer(data=MockHTMLDict())
241+
serializer = self.Serializer(data=QueryDict(''))
249242
assert serializer.is_valid()
250243
assert serializer.validated_data == {'archived': False}
251244

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

258-
serializer = TestSerializer(data=MockHTMLDict())
251+
serializer = TestSerializer(data=QueryDict(''))
259252
assert serializer.is_valid()
260253
assert serializer.validated_data == {'message': 'happy'}
261254

255+
def test_empty_html_integerfield(self):
256+
class TestSerializer(serializers.Serializer):
257+
message = serializers.IntegerField(default=123)
258+
259+
serializer = TestSerializer(data=QueryDict('message='))
260+
assert serializer.is_valid()
261+
assert serializer.validated_data == {'message': 123}
262+
263+
def test_empty_html_uuidfield_with_default(self):
264+
class TestSerializer(serializers.Serializer):
265+
message = serializers.UUIDField(default=uuid.uuid4)
266+
267+
serializer = TestSerializer(data=QueryDict('message='))
268+
assert serializer.is_valid()
269+
assert list(serializer.validated_data.keys()) == ['message']
270+
271+
def test_empty_html_uuidfield_with_optional(self):
272+
class TestSerializer(serializers.Serializer):
273+
message = serializers.UUIDField(required=False)
274+
275+
serializer = TestSerializer(data=QueryDict('message='))
276+
assert serializer.is_valid()
277+
assert list(serializer.validated_data.keys()) == []
278+
262279
def test_empty_html_charfield_allow_null(self):
263280
class TestSerializer(serializers.Serializer):
264281
message = serializers.CharField(allow_null=True)
265282

266-
serializer = TestSerializer(data=MockHTMLDict({'message': ''}))
283+
serializer = TestSerializer(data=QueryDict('message='))
267284
assert serializer.is_valid()
268285
assert serializer.validated_data == {'message': None}
269286

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

274-
serializer = TestSerializer(data=MockHTMLDict({'expiry': ''}))
291+
serializer = TestSerializer(data=QueryDict('expiry='))
275292
assert serializer.is_valid()
276293
assert serializer.validated_data == {'expiry': None}
277294

278295
def test_empty_html_charfield_allow_null_allow_blank(self):
279296
class TestSerializer(serializers.Serializer):
280297
message = serializers.CharField(allow_null=True, allow_blank=True)
281298

282-
serializer = TestSerializer(data=MockHTMLDict({'message': ''}))
299+
serializer = TestSerializer(data=QueryDict('message='))
283300
assert serializer.is_valid()
284301
assert serializer.validated_data == {'message': ''}
285302

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

290-
serializer = TestSerializer(data=MockHTMLDict())
307+
serializer = TestSerializer(data=QueryDict(''))
291308
assert serializer.is_valid()
292309
assert serializer.validated_data == {}
293310

@@ -1116,8 +1133,6 @@ class TestMultipleChoiceField(FieldValues):
11161133
)
11171134

11181135
def test_against_partial_and_full_updates(self):
1119-
# serializer = self.Serializer(data=MockHTMLDict())
1120-
from django.http import QueryDict
11211136
field = serializers.MultipleChoiceField(choices=(('a', 'a'), ('b', 'b')))
11221137
field.partial = False
11231138
assert field.get_value(QueryDict({})) == []

0 commit comments

Comments
 (0)