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