summaryrefslogtreecommitdiff
path: root/django/forms/models.py
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2015-09-19 14:23:55 +0200
committerClaude Paroz <claude@2xlibre.net>2015-09-21 21:50:11 +0200
commit158b0a28374054b1c3f94a9602b69f93fc980448 (patch)
treeebf4f3db3bd685e29fceb3003e902c73fbc296c9 /django/forms/models.py
parent5023d63f8577d032ad3705448a672c40f025a014 (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.py14
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: