JSONField not rendered properly in DRF browsable API HTML form · Issue #4999 · encode/django-rest-framework (original) (raw)
Checklist
- I have verified that that issue exists against the
master
branch of Django REST framework. - I have searched for similar issues in both open and closed tickets and cannot find a duplicate.
- JSONField webform-input always parsed as string #4135: webform-input parsed as string (PR: Allow JSONField to handle HTML form input. #4565)
- This is not a usage question. (Those should be directed to the discussion group instead.)
- This cannot be dealt with as a third party library. (We prefer new functionality to be in the form of third party libraries where possible.)
- I have reduced the issue to the simplest possible case.
- I have included a failing test as a pull request. (If you are unable to do so we can still accept the issue.)
Expected behavior
Assuming:
- a valid JSON object is stored in postgreSQL as a django
models.JSONField
and - that data is serialized using DRF's serializers.JSONField,
then that data should render as a JSON object in DRF browsable API (particularly because the serializer requires input to be valid JSON for POST/PUT/PATCH methods)
Actual behavior
Data renders as native python in DRF browsable API form field (e.g. single quotes, uppercase booleans)
Note that the "Raw data" view of the input section renders the data correctly as JSON.
Steps to reproduce
(venv)vagrant@vm:/vagrant/src/app$ python -V Python 3.4.3 (venv)vagrant@vm:/vagrant/src/app$ psql -V psql (PostgreSQL) 9.6.2
# requirements.txt
Django==1.10.6
psycopg2==2.7.1
-e git+git@github.com:tomchristie/django-rest-framework.git@73ad88eaae2f49bfd09508f2dcd6446677800a26#egg=djangorestframework-origin/HEAD
models.py
from django.db import models from django.contrib.postgres.fields import JSONField
class Foo(models.Model):
name = models.CharField(max_length=24)
data = JSONField()
serializers.py
from rest_framework import serializers
from jsontest import models
class FooSerializer(serializers.HyperlinkedModelSerializer):
name = serializers.CharField(max_length=24)
data = serializers.JSONField()
class Meta:
model = models.Foo
fields = ('url', 'name', 'data')
>>> from jsontest.models import *
>>> f = Foo()
>>> f.name = 'created via shell'
>>> f.data = {'input': 'native dict', 'bar': True}
>>> f.save()
>>> f.id
1