diff --git a/django/forms/formsets.py b/django/forms/formsets.py index 1e8edfdb79..bdcef92dec 100644 --- a/django/forms/formsets.py +++ b/django/forms/formsets.py @@ -254,13 +254,10 @@ class BaseFormSet(object): errors = property(_get_errors) def _should_delete_form(self, form): - # The way we lookup the value of the deletion field here takes - # more code than we'd like, but the form's cleaned_data will - # not exist if the form is invalid. - field = form.fields[DELETION_FIELD_NAME] - raw_value = form._raw_value(DELETION_FIELD_NAME) - should_delete = field.clean(raw_value) - return should_delete + """ + Returns whether or not the form was marked for deletion. + """ + return form.cleaned_data.get(DELETION_FIELD_NAME, False) def is_valid(self): """ diff --git a/django/forms/models.py b/django/forms/models.py index 2482437152..1aa49eaaec 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -591,6 +591,10 @@ class BaseModelFormSet(BaseFormSet): return [] saved_instances = [] + try: + forms_to_delete = self.deleted_forms + except AttributeError: + forms_to_delete = [] for form in self.initial_forms: pk_name = self._pk_field.name raw_pk_value = form._raw_value(pk_name) @@ -601,7 +605,7 @@ class BaseModelFormSet(BaseFormSet): pk_value = getattr(pk_value, 'pk', pk_value) obj = self._existing_object(pk_value) - if self.can_delete and self._should_delete_form(form): + if form in forms_to_delete: self.deleted_objects.append(obj) obj.delete() continue