Skip to content

Commit 95ae92e

Browse files
authored
Handle non-dict values for NestedSerializer during BrowsableAPI rendering.
1 parent 0551216 commit 95ae92e

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

rest_framework/utils/serializer_helpers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from collections import OrderedDict
2-
from collections.abc import MutableMapping
2+
from collections.abc import Mapping, MutableMapping
33

44
from django.utils.encoding import force_str
55

@@ -101,7 +101,7 @@ class NestedBoundField(BoundField):
101101
"""
102102

103103
def __init__(self, field, value, errors, prefix=''):
104-
if value is None or value == '':
104+
if value is None or value == '' or not isinstance(value, Mapping):
105105
value = {}
106106
super().__init__(field, value, errors, prefix)
107107

tests/test_bound_fields.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,33 @@ class ExampleSerializer(serializers.Serializer):
163163
rendered_packed = ''.join(rendered.split())
164164
assert rendered_packed == expected_packed
165165

166+
def test_rendering_nested_fields_with_not_mappable_value(self):
167+
from rest_framework.renderers import HTMLFormRenderer
168+
169+
class Nested(serializers.Serializer):
170+
text_field = serializers.CharField()
171+
172+
class ExampleSerializer(serializers.Serializer):
173+
nested = Nested()
174+
175+
serializer = ExampleSerializer(data={'nested': 1})
176+
assert not serializer.is_valid()
177+
renderer = HTMLFormRenderer()
178+
for field in serializer:
179+
rendered = renderer.render_field(field, {})
180+
expected_packed = (
181+
'<fieldset>'
182+
'<legend>Nested</legend>'
183+
'<divclass="form-group">'
184+
'<label>Textfield</label>'
185+
'<inputname="nested.text_field"class="form-control"type="text"value="">'
186+
'</div>'
187+
'</fieldset>'
188+
)
189+
190+
rendered_packed = ''.join(rendered.split())
191+
assert rendered_packed == expected_packed
192+
166193

167194
class TestJSONBoundField:
168195
def test_as_form_fields(self):

0 commit comments

Comments
 (0)