Skip to content

Commit 80d0ee5

Browse files
Merge pull request #5042 from boxingwizards/i4999
PoC Add JSONBoundField to serializers (Fixes #4999)
2 parents 5ba2368 + f56b117 commit 80d0ee5

3 files changed

Lines changed: 17 additions & 3 deletions

File tree

rest_framework/serializers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
get_relation_kwargs, get_url_kwargs
3939
)
4040
from rest_framework.utils.serializer_helpers import (
41-
BindingDict, BoundField, NestedBoundField, ReturnDict, ReturnList
41+
BindingDict, BoundField, JSONBoundField, NestedBoundField, ReturnDict,
42+
ReturnList
4243
)
4344
from rest_framework.validators import (
4445
UniqueForDateValidator, UniqueForMonthValidator, UniqueForYearValidator,
@@ -521,6 +522,8 @@ def __getitem__(self, key):
521522
error = self.errors.get(key) if hasattr(self, '_errors') else None
522523
if isinstance(field, Serializer):
523524
return NestedBoundField(field, value, error)
525+
if isinstance(field, JSONField):
526+
return JSONBoundField(field, value, error)
524527
return BoundField(field, value, error)
525528

526529
# Include a backlink to the serializer class on return objects.

rest_framework/utils/field_mapping.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from django.db import models
99
from django.utils.text import capfirst
1010

11-
from rest_framework.compat import DecimalValidator
11+
from rest_framework.compat import DecimalValidator, JSONField
1212
from rest_framework.validators import UniqueValidator
1313

1414
NUMERIC_FIELD_TYPES = (
@@ -88,7 +88,7 @@ def get_field_kwargs(field_name, model_field):
8888
if decimal_places is not None:
8989
kwargs['decimal_places'] = decimal_places
9090

91-
if isinstance(model_field, models.TextField):
91+
if isinstance(model_field, models.TextField) or (JSONField and isinstance(model_field, JSONField)):
9292
kwargs['style'] = {'base_template': 'textarea.html'}
9393

9494
if isinstance(model_field, models.AutoField) or not model_field.editable:

rest_framework/utils/serializer_helpers.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import unicode_literals
22

33
import collections
4+
import json
45
from collections import OrderedDict
56

67
from django.utils.encoding import force_text
@@ -82,6 +83,16 @@ def as_form_field(self):
8283
return self.__class__(self._field, value, self.errors, self._prefix)
8384

8485

86+
class JSONBoundField(BoundField):
87+
def as_form_field(self):
88+
value = self.value
89+
try:
90+
value = json.dumps(self.value, sort_keys=True, indent=4)
91+
except TypeError:
92+
pass
93+
return self.__class__(self._field, value, self.errors, self._prefix)
94+
95+
8596
class NestedBoundField(BoundField):
8697
"""
8798
This `BoundField` additionally implements __iter__ and __getitem__

0 commit comments

Comments
 (0)