[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 from45e049937
. Refs #13776. Backport of65a1055a3
from master.
This commit is contained in:
parent
5023d63f85
commit
158b0a2837
|
@ -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:
|
||||
|
|
|
@ -43,3 +43,6 @@ Bugfixes
|
|||
* Moved the :ref:`unsaved model instance assignment data loss check
|
||||
<unsaved-model-instance-check-18>` on reverse relations to ``Model.save()``
|
||||
(:ticket:`25160`).
|
||||
|
||||
* Readded inline foreign keys to form instances when validating model formsets
|
||||
(:ticket:`25431`).
|
||||
|
|
|
@ -37,6 +37,10 @@ class Book(models.Model):
|
|||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
def clean(self):
|
||||
# Ensure author is always accessible in clean method
|
||||
assert self.author.name is not None
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class BookWithCustomPK(models.Model):
|
||||
|
|
Loading…
Reference in New Issue