mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-30 18:09:59 +03:00
Fix JSONBoundField usage on nested serializers (#6211)
This commit is contained in:
parent
1c3f796219
commit
922e767524
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user