diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index ba01c3434b..6e7e76fa85 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -38,7 +38,8 @@ 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 @@ def __getitem__(self, key): 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. diff --git a/rest_framework/utils/field_mapping.py b/rest_framework/utils/field_mapping.py index b8817d9766..cc82492dc9 100644 --- a/rest_framework/utils/field_mapping.py +++ b/rest_framework/utils/field_mapping.py @@ -8,7 +8,7 @@ from django.db import models from django.utils.text import capfirst -from rest_framework.compat import DecimalValidator +from rest_framework.compat import DecimalValidator, JSONField from rest_framework.validators import UniqueValidator NUMERIC_FIELD_TYPES = ( @@ -88,7 +88,7 @@ def get_field_kwargs(field_name, model_field): if decimal_places is not None: kwargs['decimal_places'] = decimal_places - if isinstance(model_field, models.TextField): + if isinstance(model_field, models.TextField) or (JSONField and isinstance(model_field, JSONField)): kwargs['style'] = {'base_template': 'textarea.html'} if isinstance(model_field, models.AutoField) or not model_field.editable: diff --git a/rest_framework/utils/serializer_helpers.py b/rest_framework/utils/serializer_helpers.py index 4734332af8..d4c659e5fb 100644 --- a/rest_framework/utils/serializer_helpers.py +++ b/rest_framework/utils/serializer_helpers.py @@ -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,16 @@ def as_form_field(self): return self.__class__(self._field, value, self.errors, self._prefix) +class JSONBoundField(BoundField): + def as_form_field(self): + value = self.value + try: + value = json.dumps(self.value, sort_keys=True, indent=4) + except TypeError: + pass + return self.__class__(self._field, value, self.errors, self._prefix) + + class NestedBoundField(BoundField): """ This `BoundField` additionally implements __iter__ and __getitem__
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: