diff options
| author | Claude Paroz <claude@2xlibre.net> | 2013-02-08 21:30:06 +0100 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2013-02-08 21:35:19 +0100 |
| commit | f44922c79516b9caf0e09fb060f20c896668b90f (patch) | |
| tree | 9b9ca12eaf91d7e01e1d4420b3d18f1c0ea71817 /django/forms | |
| parent | db09a2de6e1bc7121d301dad9610efcda9c7a925 (diff) | |
Fixed #18906 -- Ignored to-be-deleted forms in formset validate_unique
Thanks c.pollock at bangor.ac.uk for the report.
Diffstat (limited to 'django/forms')
| -rw-r--r-- | django/forms/formsets.py | 5 | ||||
| -rw-r--r-- | django/forms/models.py | 19 |
2 files changed, 8 insertions, 16 deletions
diff --git a/django/forms/formsets.py b/django/forms/formsets.py index ee9a2b5f63..1addbc617b 100644 --- a/django/forms/formsets.py +++ b/django/forms/formsets.py @@ -179,11 +179,10 @@ class BaseFormSet(object): @property def deleted_forms(self): """ - Returns a list of forms that have been marked for deletion. Raises an - AttributeError if deletion is not allowed. + Returns a list of forms that have been marked for deletion. """ if not self.is_valid() or not self.can_delete: - raise AttributeError("'%s' object has no attribute 'deleted_forms'" % self.__class__.__name__) + return [] # construct _deleted_form_indexes which is just a list of form indexes # that have had their deletion widget set to True if not hasattr(self, '_deleted_form_indexes'): diff --git a/django/forms/models.py b/django/forms/models.py index e2d739fd1a..c4e0301614 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -520,9 +520,9 @@ class BaseModelFormSet(BaseFormSet): # Collect unique_checks and date_checks to run from all the forms. all_unique_checks = set() all_date_checks = set() - for form in self.forms: - if not form.is_valid(): - continue + forms_to_delete = self.deleted_forms + valid_forms = [form for form in self.forms if form.is_valid() and form not in forms_to_delete] + for form in valid_forms: exclude = form._get_validation_exclusions() unique_checks, date_checks = form.instance._get_unique_checks(exclude=exclude) all_unique_checks = all_unique_checks.union(set(unique_checks)) @@ -532,9 +532,7 @@ class BaseModelFormSet(BaseFormSet): # Do each of the unique checks (unique and unique_together) for uclass, unique_check in all_unique_checks: seen_data = set() - for form in self.forms: - if not form.is_valid(): - continue + for form in valid_forms: # get data for each field of each of unique_check row_data = tuple([form.cleaned_data[field] for field in unique_check if field in form.cleaned_data]) if row_data and not None in row_data: @@ -554,9 +552,7 @@ class BaseModelFormSet(BaseFormSet): for date_check in all_date_checks: seen_data = set() uclass, lookup, field, unique_for = date_check - for form in self.forms: - if not form.is_valid(): - continue + for form in valid_forms: # see if we have data for both fields if (form.cleaned_data and form.cleaned_data[field] is not None and form.cleaned_data[unique_for] is not None): @@ -611,10 +607,7 @@ class BaseModelFormSet(BaseFormSet): return [] saved_instances = [] - try: - forms_to_delete = self.deleted_forms - except AttributeError: - forms_to_delete = [] + forms_to_delete = self.deleted_forms for form in self.initial_forms: pk_name = self._pk_field.name raw_pk_value = form._raw_value(pk_name) |
