mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-01 11:00:13 +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.')
|
'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):
|
def __init__(self, *args, **kwargs):
|
||||||
self.binary = kwargs.pop('binary', False)
|
self.binary = kwargs.pop('binary', False)
|
||||||
super(JSONField, self).__init__(*args, **kwargs)
|
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
|
error = self.errors.get(key) if isinstance(self.errors, dict) else None
|
||||||
if hasattr(field, 'fields'):
|
if hasattr(field, 'fields'):
|
||||||
return NestedBoundField(field, value, error, prefix=self.name + '.')
|
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 + '.')
|
return BoundField(field, value, error, prefix=self.name + '.')
|
||||||
|
|
||||||
def as_form_field(self):
|
def as_form_field(self):
|
||||||
|
|
|
@ -91,6 +91,10 @@ class TestSimpleBoundField:
|
||||||
assert rendered_packed == expected_packed
|
assert rendered_packed == expected_packed
|
||||||
|
|
||||||
|
|
||||||
|
class CustomJSONField(serializers.JSONField):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestNestedBoundField:
|
class TestNestedBoundField:
|
||||||
def test_nested_empty_bound_field(self):
|
def test_nested_empty_bound_field(self):
|
||||||
class Nested(serializers.Serializer):
|
class Nested(serializers.Serializer):
|
||||||
|
@ -117,14 +121,31 @@ class TestNestedBoundField:
|
||||||
class Nested(serializers.Serializer):
|
class Nested(serializers.Serializer):
|
||||||
bool_field = serializers.BooleanField()
|
bool_field = serializers.BooleanField()
|
||||||
null_field = serializers.IntegerField(allow_null=True)
|
null_field = serializers.IntegerField(allow_null=True)
|
||||||
|
json_field = serializers.JSONField()
|
||||||
|
custom_json_field = CustomJSONField()
|
||||||
|
|
||||||
class ExampleSerializer(serializers.Serializer):
|
class ExampleSerializer(serializers.Serializer):
|
||||||
nested = Nested()
|
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.is_valid()
|
||||||
assert serializer['nested']['bool_field'].as_form_field().value == ''
|
assert serializer['nested']['bool_field'].as_form_field().value == ''
|
||||||
assert serializer['nested']['null_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):
|
def test_rendering_nested_fields_with_none_value(self):
|
||||||
from rest_framework.renderers import HTMLFormRenderer
|
from rest_framework.renderers import HTMLFormRenderer
|
||||||
|
|
Loading…
Reference in New Issue
Block a user