diff --git a/rest_framework/utils/serializer_helpers.py b/rest_framework/utils/serializer_helpers.py index b11d3fd0..cfaeb25e 100644 --- a/rest_framework/utils/serializer_helpers.py +++ b/rest_framework/utils/serializer_helpers.py @@ -90,7 +90,7 @@ class NestedBoundField(BoundField): """ def __init__(self, field, value, errors, prefix=''): - if value is None: + if value is None or value is '': value = {} super(NestedBoundField, self).__init__(field, value, errors, prefix) diff --git a/tests/test_bound_fields.py b/tests/test_bound_fields.py index 71d49a38..f2fac8f0 100644 --- a/tests/test_bound_fields.py +++ b/tests/test_bound_fields.py @@ -90,3 +90,40 @@ class TestNestedBoundField: assert serializer.is_valid() assert serializer['nested']['bool_field'].as_form_field().value == '' assert serializer['nested']['null_field'].as_form_field().value == '' + + def test_rendering_nested_fields_with_none_value(self): + from rest_framework.renderers import HTMLFormRenderer + + class Nested1(serializers.Serializer): + text_field = serializers.CharField() + + class Nested2(serializers.Serializer): + nested1 = Nested1(allow_null=True) + text_field = serializers.CharField() + + class ExampleSerializer(serializers.Serializer): + nested2 = Nested2() + + serializer = ExampleSerializer(data={'nested2': {'nested1': None, 'text_field': 'test'}}) + assert serializer.is_valid() + renderer = HTMLFormRenderer() + for field in serializer: + rendered = renderer.render_field(field, {}) + expected_packed = ( + '
' + 'Nested2' + '
' + 'Nested1' + '' + '' + '' + '' + '
' + '' + '' + '' + '' + '
' + ) + rendered_packed = ''.join(rendered.split()) + assert rendered_packed == expected_packed