diff options
| author | Claude Paroz <claude@2xlibre.net> | 2015-09-19 14:23:55 +0200 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2015-09-21 21:50:11 +0200 |
| commit | 158b0a28374054b1c3f94a9602b69f93fc980448 (patch) | |
| tree | ebf4f3db3bd685e29fceb3003e902c73fbc296c9 /django/forms/models.py | |
| parent | 5023d63f8577d032ad3705448a672c40f025a014 (diff) | |
[1.8.x] Fixed #25431 -- Readded inline foreign keys to modelformset instances
Too much field exclusions in form's construct_instance() in _post_clean()
could lead to some unexpected missing ForeignKey values.
Fixes a regression from 45e049937. Refs #13776.
Backport of 65a1055a3 from master.
Diffstat (limited to 'django/forms/models.py')
| -rw-r--r-- | django/forms/models.py | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/django/forms/models.py b/django/forms/models.py index 08a3697cc1..2137e9f4a6 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -405,10 +405,11 @@ class BaseModelForm(BaseForm): opts = self._meta exclude = self._get_validation_exclusions() - # a subset of `exclude` which won't have the InlineForeignKeyField - # if we're adding a new object since that value doesn't exist - # until after the new instance is saved to the database. - construct_instance_exclude = list(exclude) + + try: + self.instance = construct_instance(self, self.instance, opts.fields, exclude) + except ValidationError as e: + self._update_errors(e) # Foreign Keys being used to represent inline relationships # are excluded from basic field value validation. This is for two @@ -419,13 +420,8 @@ class BaseModelForm(BaseForm): # so this can't be part of _get_validation_exclusions(). for name, field in self.fields.items(): if isinstance(field, InlineForeignKeyField): - if self.cleaned_data.get(name) is not None and self.cleaned_data[name]._state.adding: - construct_instance_exclude.append(name) exclude.append(name) - # Update the model instance with self.cleaned_data. - self.instance = construct_instance(self, self.instance, opts.fields, construct_instance_exclude) - try: self.instance.full_clean(exclude=exclude, validate_unique=False) except ValidationError as e: |
