Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed a regression in forms changed_data

Thanks Loic Bistuer for spotting the regression and the initial
patch. Refs #16612.
  • Loading branch information...
commit cbfb8ed53b31ec9701f5fb8e519a8644fd4c8095 1 parent 6983a1a
@claudep claudep authored
Showing with 33 additions and 2 deletions.
  1. +7 −2 django/forms/forms.py
  2. +26 −0 tests/forms_tests/tests/forms.py
View
9 django/forms/forms.py
@@ -345,8 +345,13 @@ def changed_data(self):
else:
initial_prefixed_name = self.add_initial_prefix(name)
hidden_widget = field.hidden_widget()
- initial_value = field.to_python(hidden_widget.value_from_datadict(
- self.data, self.files, initial_prefixed_name))
+ try:
+ initial_value = field.to_python(hidden_widget.value_from_datadict(
+ self.data, self.files, initial_prefixed_name))
+ except ValidationError:
+ # Always assume data has changed if validation fails.
+ self._changed_data.append(name)
+ continue
if hasattr(field.widget, '_has_changed'):
warnings.warn("The _has_changed method on widgets is deprecated,"
" define it at field level instead.",
View
26 tests/forms_tests/tests/forms.py
@@ -1201,6 +1201,32 @@ class UserRegistration(Form):
<option value="w">whiz</option>
</select></li>""")
+ def test_changed_data(self):
+ class Person(Form):
+ first_name = CharField(initial='Hans')
+ last_name = CharField(initial='Greatel')
+ birthday = DateField(initial=datetime.date(1974, 8, 16))
+
+ p = Person(data={'first_name': 'Hans', 'last_name': 'Scrmbl',
+ 'birthday': '1974-08-16'})
+ self.assertTrue(p.is_valid())
+ self.assertNotIn('first_name', p.changed_data)
+ self.assertIn('last_name', p.changed_data)
+ self.assertNotIn('birthday', p.changed_data)
+
+ # Test that field raising ValidationError is always in changed_data
+ class PedanticField(forms.Field):
+ def to_python(self, value):
+ raise ValidationError('Whatever')
+
+ class Person2(Person):
+ pedantic = PedanticField(initial='whatever', show_hidden_initial=True)
+
+ p = Person2(data={'first_name': 'Hans', 'last_name': 'Scrmbl',
+ 'birthday': '1974-08-16', 'initial-pedantic': 'whatever'})
+ self.assertFalse(p.is_valid())
+ self.assertIn('pedantic', p.changed_data)
+
def test_boundfield_values(self):
# It's possible to get to the value which would be used for rendering
# the widget for a field by using the BoundField's value method.
Please sign in to comment.
Something went wrong with that request. Please try again.