diff --git a/django/forms/fields.py b/django/forms/fields.py index d9552c28fe..74cc3a6552 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -187,6 +187,10 @@ class Field(object): """ Return True if data differs from initial. """ + # Always return False if the field is disabled since self.bound_data + # always uses the initial value in this case. + if self.disabled: + return False try: data = self.to_python(data) if hasattr(self, '_coerce'): diff --git a/tests/forms_tests/field_tests/test_base.py b/tests/forms_tests/field_tests/test_base.py index 802af3b183..67c3003393 100644 --- a/tests/forms_tests/field_tests/test_base.py +++ b/tests/forms_tests/field_tests/test_base.py @@ -34,3 +34,9 @@ class BasicFieldsTests(SimpleTestCase): f.fields['field2'].choices = [('2', '2')] self.assertEqual(f.fields['field1'].widget.choices, [('1', '1')]) self.assertEqual(f.fields['field2'].widget.choices, [('2', '2')]) + + +class DisabledFieldTests(SimpleTestCase): + def test_disabled_field_has_changed_always_false(self): + disabled_field = Field(disabled=True) + self.assertFalse(disabled_field.has_changed('x', 'y'))