diff --git a/django/forms/widgets.py b/django/forms/widgets.py index c761ea857d..4782b99117 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -533,6 +533,9 @@ class CheckboxInput(Widget): def _has_changed(self, initial, data): # Sometimes data or initial could be None or '' which should be the # same thing as False. + if initial == 'False': + # show_hidden_initial may have transformed False to 'False' + initial = False return bool(initial) != bool(data) class Select(Widget): diff --git a/tests/regressiontests/forms/tests/widgets.py b/tests/regressiontests/forms/tests/widgets.py index 31c0e65c7c..f9dc4a7ec8 100644 --- a/tests/regressiontests/forms/tests/widgets.py +++ b/tests/regressiontests/forms/tests/widgets.py @@ -240,6 +240,8 @@ class FormsWidgetTestCase(TestCase): self.assertTrue(w._has_changed(False, 'on')) self.assertFalse(w._has_changed(True, 'on')) self.assertTrue(w._has_changed(True, '')) + # Initial value may have mutated to a string due to show_hidden_initial (#19537) + self.assertTrue(w._has_changed('False', 'on')) def test_select(self): w = Select()