za...@bcc190cf-cafb-0310-a4f2-bffc1f526a37  committed 3f665ef

[soc2009/admin-ui] Fix for ticket #11720: "When an OrderField is on an inline and there are empty inlines, saving throws an error"

If the only things changed in an empty form are OrderField(s), it is treated as untouched.

  • Participants
  • Parent commits 8417bce
  • Branches soc2009/admin-ui

Comments (0)

Files changed (1)

File django/forms/

 from django.utils.encoding import StrAndUnicode, smart_unicode, force_unicode
 from django.utils.safestring import mark_safe
-from fields import Field, FileField
+from fields import Field, FileField, OrderField
 from widgets import Media, media_property, TextInput, Textarea
 from util import flatatt, ErrorDict, ErrorList, ValidationError
     def _get_changed_data(self):
         if self._changed_data is None:
             self._changed_data = []
+            order_fields = []
             # XXX: For now we're asking the individual widgets whether or not the
             # data has changed. It would probably be more efficient to hash the
             # initial data, store it in a hidden field, and compare a hash of the
                     initial_value = hidden_widget.value_from_datadict(
               , self.files, initial_prefixed_name)
                 if field.widget._has_changed(initial_value, data_value):
+                    if isinstance(field, OrderField):
+                        order_fields.append(name)
+            # if this is an empty form and only the OrderField is changed, we want to treat 
+            # it as untouched
+            if self.empty_permitted and order_fields != []:
+                difference = filter(lambda x: x not in self._changed_data, order_fields)
+                if difference == []:
+                    self._changed_data = []
         return self._changed_data
     changed_data = property(_get_changed_data)