1
0
mirror of https://github.com/django/django.git synced 2025-10-24 22:26:08 +00:00

Fixed #25532 -- Properly redisplayed JSONField form input values

Thanks David Szotten for the report and Tommy Beadle for code inspiration.
Thanks Tim Graham for the review.
This commit is contained in:
Claude Paroz
2016-03-26 20:11:57 +01:00
parent 64aba7a8ab
commit db19619545
4 changed files with 52 additions and 4 deletions

View File

@@ -1,11 +1,16 @@
import json
from django import forms
from django.utils import six
from django.utils.translation import ugettext_lazy as _
__all__ = ['JSONField']
class InvalidJSONInput(six.text_type):
pass
class JSONField(forms.CharField):
default_error_messages = {
'invalid': _("'%(value)s' value must be valid JSON."),
@@ -27,5 +32,15 @@ class JSONField(forms.CharField):
params={'value': value},
)
def bound_data(self, data, initial):
if self.disabled:
return initial
try:
return json.loads(data)
except ValueError:
return InvalidJSONInput(data)
def prepare_value(self, value):
if isinstance(value, InvalidJSONInput):
return value
return json.dumps(value)

View File

@@ -365,13 +365,14 @@ class BaseForm(object):
def _clean_fields(self):
for name, field in self.fields.items():
if field.disabled:
# Initial values are supposed to be clean
self.cleaned_data[name] = self.initial.get(name, field.initial)
continue
# value_from_datadict() gets the data from the data dictionaries.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
if field.disabled:
value = self.initial.get(name, field.initial)
else:
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.initial.get(name, field.initial)