PoC Add JSONBoundField to serializers (Fixes #4999)

Per issue #4999, JSONFields are not rendered properly in the DRF
browsable API HTML forms.  This patch attempts to fix that behavior by
introducing a JSONBoundField helper similar to the NestedBoundField
helper.
This commit is contained in:
Dave Allan 2017-04-01 20:31:27 -04:00
parent 66e015c5ec
commit 11d8e4df88
2 changed files with 11 additions and 1 deletions

View File

@ -38,7 +38,8 @@ from rest_framework.utils.field_mapping import (
get_relation_kwargs, get_url_kwargs
)
from rest_framework.utils.serializer_helpers import (
BindingDict, BoundField, NestedBoundField, ReturnDict, ReturnList
BindingDict, BoundField, JSONBoundField, NestedBoundField, ReturnDict,
ReturnList
)
from rest_framework.validators import (
UniqueForDateValidator, UniqueForMonthValidator, UniqueForYearValidator,
@ -521,6 +522,8 @@ class Serializer(BaseSerializer):
error = self.errors.get(key) if hasattr(self, '_errors') else None
if isinstance(field, Serializer):
return NestedBoundField(field, value, error)
if isinstance(field, JSONField):
return JSONBoundField(field, value, error)
return BoundField(field, value, error)
# Include a backlink to the serializer class on return objects.

View File

@ -1,6 +1,7 @@
from __future__ import unicode_literals
import collections
import json
from collections import OrderedDict
from django.utils.encoding import force_text
@ -82,6 +83,12 @@ class BoundField(object):
return self.__class__(self._field, value, self.errors, self._prefix)
class JSONBoundField(BoundField):
def as_form_field(self):
value = json.dumps(self.value)
return self.__class__(self._field, value, self.errors, self._prefix)
class NestedBoundField(BoundField):
"""
This `BoundField` additionally implements __iter__ and __getitem__