diff options
| author | Claude Paroz <claude@2xlibre.net> | 2016-03-26 20:11:57 +0100 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2016-04-01 09:04:20 +0200 |
| commit | db19619545dd99a1d2502c72974d79eca33acff7 (patch) | |
| tree | 114ee5c154d19d49d06d4f6e9e1deb4e2d4e7039 /django | |
| parent | 64aba7a8aba06b8be52a1a099b44e1d3be4bdd26 (diff) | |
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.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/postgres/forms/jsonb.py | 15 | ||||
| -rw-r--r-- | django/forms/forms.py | 9 |
2 files changed, 20 insertions, 4 deletions
diff --git a/django/contrib/postgres/forms/jsonb.py b/django/contrib/postgres/forms/jsonb.py index 8eefc14993..415288dc90 100644 --- a/django/contrib/postgres/forms/jsonb.py +++ b/django/contrib/postgres/forms/jsonb.py @@ -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) diff --git a/django/forms/forms.py b/django/forms/forms.py index 7aceb905a7..0a15ec510f 100644 --- a/django/forms/forms.py +++ b/django/forms/forms.py @@ -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) |
