Fix JSONBoundField usage on nested serializers (#6211)

This commit is contained in:
Alex Hedlund 2018-10-15 08:23:33 +03:00
parent 1c3f796219
commit 922e767524
3 changed files with 27 additions and 1 deletions

View File

@ -1766,6 +1766,9 @@ class JSONField(Field):
'invalid': _('Value must be valid JSON.')
}
# Workaround for isinstance calls when importing the field isn't possible
_is_jsonfield = True
def __init__(self, *args, **kwargs):
self.binary = kwargs.pop('binary', False)
super(JSONField, self).__init__(*args, **kwargs)

View File

@ -118,6 +118,8 @@ class NestedBoundField(BoundField):
error = self.errors.get(key) if isinstance(self.errors, dict) else None
if hasattr(field, 'fields'):
return NestedBoundField(field, value, error, prefix=self.name + '.')
elif getattr(field, '_is_jsonfield', False):
return JSONBoundField(field, value, error, prefix=self.name + '.')
return BoundField(field, value, error, prefix=self.name + '.')
def as_form_field(self):

View File

@ -91,6 +91,10 @@ class TestSimpleBoundField:
assert rendered_packed == expected_packed
class CustomJSONField(serializers.JSONField):
pass
class TestNestedBoundField:
def test_nested_empty_bound_field(self):
class Nested(serializers.Serializer):
@ -117,14 +121,31 @@ class TestNestedBoundField:
class Nested(serializers.Serializer):
bool_field = serializers.BooleanField()
null_field = serializers.IntegerField(allow_null=True)
json_field = serializers.JSONField()
custom_json_field = CustomJSONField()
class ExampleSerializer(serializers.Serializer):
nested = Nested()
serializer = ExampleSerializer(data={'nested': {'bool_field': False, 'null_field': None}})
serializer = ExampleSerializer(
data={'nested': {
'bool_field': False, 'null_field': None,
'json_field': {'bool_item': True, 'number': 1, 'text_item': 'text'},
'custom_json_field': {'bool_item': True, 'number': 1, 'text_item': 'text'},
}})
assert serializer.is_valid()
assert serializer['nested']['bool_field'].as_form_field().value == ''
assert serializer['nested']['null_field'].as_form_field().value == ''
assert serializer['nested']['json_field'].as_form_field().value == '''{
"bool_item": true,
"number": 1,
"text_item": "text"
}'''
assert serializer['nested']['custom_json_field'].as_form_field().value == '''{
"bool_item": true,
"number": 1,
"text_item": "text"
}'''
def test_rendering_nested_fields_with_none_value(self):
from rest_framework.renderers import HTMLFormRenderer