summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQi Zhao <zhaoqi99@outlook.com>2020-10-08 21:51:14 +0800
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-10-09 08:44:32 +0200
commit8c403b17f94a4ace87bfdd7d40bbc3afb18f7577 (patch)
tree75043715e3f00f71563717476ff7c691a42aaa20
parentb0e5e7b67153e6252bcad959ccb061402e7ecd58 (diff)
[3.1.x] Fixed #32080 -- Fixed displaying Unicode chars in forms.JSONField and read-only JSONField values in admin.
Backport of de81676b51e4dad510ef387c3ae625f9091fe57f from master
-rw-r--r--AUTHORS1
-rw-r--r--django/contrib/admin/utils.py3
-rw-r--r--django/forms/fields.py2
-rw-r--r--docs/releases/3.1.3.txt5
-rw-r--r--tests/admin_utils/tests.py1
-rw-r--r--tests/forms_tests/field_tests/test_jsonfield.py6
6 files changed, 16 insertions, 2 deletions
diff --git a/AUTHORS b/AUTHORS
index 80748781cb..4cdfa6b1b0 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -740,6 +740,7 @@ answer newbie questions, and generally made Django that much better:
Priyansh Saxena <askpriyansh@gmail.com>
Przemysław Buczkowski <przemub@przemub.pl>
Przemysław Suliga <http://suligap.net>
+ Qi Zhao <zhaoqi99@outlook.com>
Rachel Tobin <rmtobin@me.com>
Rachel Willmer <http://www.willmer.com/kb/>
Radek Švarz <https://www.svarz.cz/translate/>
diff --git a/django/contrib/admin/utils.py b/django/contrib/admin/utils.py
index 446083e659..ba06da5211 100644
--- a/django/contrib/admin/utils.py
+++ b/django/contrib/admin/utils.py
@@ -1,5 +1,6 @@
import datetime
import decimal
+import json
from collections import defaultdict
from django.core.exceptions import FieldDoesNotExist
@@ -400,7 +401,7 @@ def display_for_field(value, field, empty_value_display):
return format_html('<a href="{}">{}</a>', value.url, value)
elif isinstance(field, models.JSONField) and value:
try:
- return field.get_prep_value(value)
+ return json.dumps(value, ensure_ascii=False, cls=field.encoder)
except TypeError:
return display_for_value(value, empty_value_display)
else:
diff --git a/django/forms/fields.py b/django/forms/fields.py
index 36dad72704..0efeb298cd 100644
--- a/django/forms/fields.py
+++ b/django/forms/fields.py
@@ -1265,7 +1265,7 @@ class JSONField(CharField):
def prepare_value(self, value):
if isinstance(value, InvalidJSONInput):
return value
- return json.dumps(value, cls=self.encoder)
+ return json.dumps(value, ensure_ascii=False, cls=self.encoder)
def has_changed(self, initial, data):
if super().has_changed(initial, data):
diff --git a/docs/releases/3.1.3.txt b/docs/releases/3.1.3.txt
index 853ec7a48d..e2bb2d0df3 100644
--- a/docs/releases/3.1.3.txt
+++ b/docs/releases/3.1.3.txt
@@ -11,3 +11,8 @@ Bugfixes
* Fixed a regression in Django 3.1.2 that caused the incorrect height of the
admin changelist search bar (:ticket:`32072`).
+
+* Fixed displaying Unicode characters in
+ :class:`forms.JSONField <django.forms.JSONField>` and read-only
+ :class:`models.JSONField <django.db.models.JSONField>` values in the admin
+ (:ticket:`32080`).
diff --git a/tests/admin_utils/tests.py b/tests/admin_utils/tests.py
index cf0d3e064e..da9d24bed5 100644
--- a/tests/admin_utils/tests.py
+++ b/tests/admin_utils/tests.py
@@ -184,6 +184,7 @@ class UtilsTests(SimpleTestCase):
({'a': {'b': 'c'}}, '{"a": {"b": "c"}}'),
(['a', 'b'], '["a", "b"]'),
('a', '"a"'),
+ ({'a': '你好 世界'}, '{"a": "你好 世界"}'),
({('a', 'b'): 'c'}, "{('a', 'b'): 'c'}"), # Invalid JSON.
]
for value, display_value in tests:
diff --git a/tests/forms_tests/field_tests/test_jsonfield.py b/tests/forms_tests/field_tests/test_jsonfield.py
index 892a23a6a7..f9e4281a01 100644
--- a/tests/forms_tests/field_tests/test_jsonfield.py
+++ b/tests/forms_tests/field_tests/test_jsonfield.py
@@ -29,6 +29,12 @@ class JSONFieldTest(SimpleTestCase):
self.assertEqual(field.prepare_value({'a': 'b'}), '{"a": "b"}')
self.assertEqual(field.prepare_value(None), 'null')
self.assertEqual(field.prepare_value('foo'), '"foo"')
+ self.assertEqual(field.prepare_value('你好,世界'), '"你好,世界"')
+ self.assertEqual(field.prepare_value({'a': '😀🐱'}), '{"a": "😀🐱"}')
+ self.assertEqual(
+ field.prepare_value(["你好,世界", "jaźń"]),
+ '["你好,世界", "jaźń"]',
+ )
def test_widget(self):
field = JSONField()