@@ -371,7 +371,7 @@ class TestBooleanHTMLInput:
371
371
def test_empty_html_checkbox (self ):
372
372
"""
373
373
HTML checkboxes do not send any value, but should be treated
374
- as `False` by BooleanField.
374
+ as `False` by BooleanField if allow_null=False .
375
375
"""
376
376
class TestSerializer (serializers .Serializer ):
377
377
archived = serializers .BooleanField ()
@@ -383,7 +383,8 @@ class TestSerializer(serializers.Serializer):
383
383
def test_empty_html_checkbox_not_required (self ):
384
384
"""
385
385
HTML checkboxes do not send any value, but should be treated
386
- as `False` by BooleanField, even if the field is required=False.
386
+ as `False` by BooleanField when the field is required=False
387
+ and allow_null=False.
387
388
"""
388
389
class TestSerializer (serializers .Serializer ):
389
390
archived = serializers .BooleanField (required = False )
@@ -392,6 +393,34 @@ class TestSerializer(serializers.Serializer):
392
393
assert serializer .is_valid ()
393
394
assert serializer .validated_data == {'archived' : False }
394
395
396
+ def test_empty_html_checkbox_allow_null (self ):
397
+ """
398
+ HTML checkboxes do not send any value and should be treated
399
+ as `None` by BooleanField if allow_null is True.
400
+ """
401
+ class TestSerializer (serializers .Serializer ):
402
+ archived = serializers .BooleanField (allow_null = True )
403
+
404
+ serializer = TestSerializer (data = QueryDict ('' ))
405
+ assert serializer .is_valid ()
406
+ assert serializer .validated_data == {'archived' : None }
407
+
408
+ def test_empty_html_checkbox_allow_null_with_default (self ):
409
+ """
410
+ BooleanField should respect default if set and still allow
411
+ setting null values.
412
+ """
413
+ class TestSerializer (serializers .Serializer ):
414
+ archived = serializers .BooleanField (allow_null = True , default = True )
415
+
416
+ serializer = TestSerializer (data = QueryDict ('' ))
417
+ assert serializer .is_valid ()
418
+ assert serializer .validated_data == {'archived' : True }
419
+
420
+ serializer = TestSerializer (data = QueryDict ('archived=' ))
421
+ assert serializer .is_valid ()
422
+ assert serializer .validated_data == {'archived' : None }
423
+
395
424
396
425
class TestHTMLInput :
397
426
def test_empty_html_charfield_with_default (self ):
0 commit comments