From 75bb9c5b39874f3a1782bb046629774afc4d836d Mon Sep 17 00:00:00 2001 From: pik Date: Sat, 21 May 2016 11:48:16 +0800 Subject: [PATCH] Allow JSONField webform-input to support JSON Objects --- rest_framework/fields.py | 10 ++++++++++ rest_framework/renderers.py | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 5eb1b3b4c..502d160b9 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1541,6 +1541,16 @@ class JSONField(Field): self.binary = kwargs.pop('binary', False) super(JSONField, self).__init__(*args, **kwargs) + def get_value(self, dictionary): + """ + If the incoming data is an html-input then it always comes in stringified via. the + multipart/form-input so we should call json.loads on it. + """ + ret = super(JSONField, self).get_value(dictionary) + if html.is_html_input(dictionary): + return json.loads(ret) + return ret + def to_internal_value(self, data): try: if self.binary: diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 63e0d836f..9235d9323 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -30,6 +30,7 @@ from rest_framework.settings import api_settings from rest_framework.utils import encoders from rest_framework.utils.breadcrumbs import get_breadcrumbs from rest_framework.utils.field_mapping import ClassLookupDict +from rest_framework.fields import JSONField def zero_as_none(value): @@ -319,9 +320,14 @@ class HTMLFormRenderer(BaseRenderer): style['template_pack'] = parent_style.get('template_pack', self.template_pack) style['renderer'] = self + # If we are rendering a JSON Field we want to convert Python literals to Javascript literals + if issubclass(field._proxy_class, JSONField): + field.value = json.dumps(field.value) + # Get a clone of the field with text-only value representation. field = field.as_form_field() + if style.get('input_type') == 'datetime-local' and isinstance(field.value, six.text_type): field.value = field.value.rstrip('Z')