From 570187b959575822febf838464ea46282cf21654 Mon Sep 17 00:00:00 2001 From: Petros Moisiadis Date: Thu, 26 Nov 2015 17:07:57 +0200 Subject: [PATCH 1/2] Updated NestedBoundField to also handle empty string when rendering its form If a NestedBoundField field has a value of `None` and is inside another NestedBoundField field, it will have its value converted to an empty string while the form of its enclosing field is being rendered. So, NestedBoundField fields with an empty string value must be handled the same way as NestedBoundField fields with a `None` value. --- rest_framework/utils/serializer_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From 3594c976b751aca07fcd9c07c4e404d81304fe07 Mon Sep 17 00:00:00 2001 From: Petros Moisiadis Date: Fri, 27 Nov 2015 15:07:29 +0200 Subject: [PATCH 2/2] Added test case for rendering nested fields with none value --- tests/test_bound_fields.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) 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