diff --git a/django/contrib/postgres/forms/hstore.py b/django/contrib/postgres/forms/hstore.py
index 3dc70ab2abc..bf562c0e8f5 100644
--- a/django/contrib/postgres/forms/hstore.py
+++ b/django/contrib/postgres/forms/hstore.py
@@ -23,13 +23,14 @@ class HStoreField(forms.CharField):
     def to_python(self, value):
         if not value:
             return {}
-        try:
-            value = json.loads(value)
-        except ValueError:
-            raise ValidationError(
-                self.error_messages['invalid_json'],
-                code='invalid_json',
-            )
+        if not isinstance(value, dict):
+            try:
+                value = json.loads(value)
+            except ValueError:
+                raise ValidationError(
+                    self.error_messages['invalid_json'],
+                    code='invalid_json',
+                )
         # Cast everything to strings for ease.
         for key, val in value.items():
             value[key] = six.text_type(val)
diff --git a/docs/releases/1.8.4.txt b/docs/releases/1.8.4.txt
index f95bcfb4dcd..070397e885f 100644
--- a/docs/releases/1.8.4.txt
+++ b/docs/releases/1.8.4.txt
@@ -22,5 +22,5 @@ Bugfixes
 * Prevented an exception in ``TestCase.setUpTestData()`` from leaking the
   transaction (:ticket:`25176`).
 
-* Fixed ``has_changed()`` method in
-  :class:`django.contrib.postgres.forms.HStoreField`.
+* Fixed ``has_changed()`` method in ``contrib.postgres.forms.HStoreField``
+  (:ticket:`25215`, :ticket:`25233`).
diff --git a/tests/postgres_tests/test_hstore.py b/tests/postgres_tests/test_hstore.py
index aa34773d1ef..f5e6f416ad8 100644
--- a/tests/postgres_tests/test_hstore.py
+++ b/tests/postgres_tests/test_hstore.py
@@ -196,6 +196,12 @@ class TestFormField(TestCase):
         form_w_hstore = HStoreFormTest({'f1': '{"a": 2}'}, initial={'f1': '{"a": 1}'})
         self.assertTrue(form_w_hstore.has_changed())
 
+        form_w_hstore = HStoreFormTest({'f1': '{"a": 1}'}, initial={'f1': {"a": 1}})
+        self.assertFalse(form_w_hstore.has_changed())
+
+        form_w_hstore = HStoreFormTest({'f1': '{"a": 2}'}, initial={'f1': {"a": 1}})
+        self.assertTrue(form_w_hstore.has_changed())
+
 
 class TestValidator(TestCase):