Commit 11d8e4df by Dave Allan

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.
parent 66e015c5
...@@ -38,7 +38,8 @@ from rest_framework.utils.field_mapping import ( ...@@ -38,7 +38,8 @@ from rest_framework.utils.field_mapping import (
get_relation_kwargs, get_url_kwargs get_relation_kwargs, get_url_kwargs
) )
from rest_framework.utils.serializer_helpers import ( from rest_framework.utils.serializer_helpers import (
BindingDict, BoundField, NestedBoundField, ReturnDict, ReturnList BindingDict, BoundField, JSONBoundField, NestedBoundField, ReturnDict,
ReturnList
) )
from rest_framework.validators import ( from rest_framework.validators import (
UniqueForDateValidator, UniqueForMonthValidator, UniqueForYearValidator, UniqueForDateValidator, UniqueForMonthValidator, UniqueForYearValidator,
...@@ -521,6 +522,8 @@ class Serializer(BaseSerializer): ...@@ -521,6 +522,8 @@ class Serializer(BaseSerializer):
error = self.errors.get(key) if hasattr(self, '_errors') else None error = self.errors.get(key) if hasattr(self, '_errors') else None
if isinstance(field, Serializer): if isinstance(field, Serializer):
return NestedBoundField(field, value, error) return NestedBoundField(field, value, error)
if isinstance(field, JSONField):
return JSONBoundField(field, value, error)
return BoundField(field, value, error) return BoundField(field, value, error)
# Include a backlink to the serializer class on return objects. # Include a backlink to the serializer class on return objects.
......
from __future__ import unicode_literals from __future__ import unicode_literals
import collections import collections
import json
from collections import OrderedDict from collections import OrderedDict
from django.utils.encoding import force_text from django.utils.encoding import force_text
...@@ -82,6 +83,12 @@ class BoundField(object): ...@@ -82,6 +83,12 @@ class BoundField(object):
return self.__class__(self._field, value, self.errors, self._prefix) 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): class NestedBoundField(BoundField):
""" """
This `BoundField` additionally implements __iter__ and __getitem__ This `BoundField` additionally implements __iter__ and __getitem__
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment