diff --git a/django/contrib/admin/validation.py b/django/contrib/admin/validation.py index 758090f896..595b951b9e 100644 --- a/django/contrib/admin/validation.py +++ b/django/contrib/admin/validation.py @@ -149,6 +149,9 @@ def validate(cls, model): validate_inline(inline, cls, model) def validate_inline(cls, parent, parent_model): + + fk = _get_foreign_key(parent_model, cls.model, fk_name=cls.fk_name, can_fail=True) + # model is already verified to exist and be a Model if cls.fk_name: # default value is None f = get_field(cls, cls.model, cls.model._meta, 'fk_name', cls.fk_name) @@ -169,7 +172,6 @@ def validate_inline(cls, parent, parent_model): # exclude if hasattr(cls, 'exclude') and cls.exclude: - fk = _get_foreign_key(parent_model, cls.model, fk_name=cls.fk_name, can_fail=True) if fk and fk.name in cls.exclude: raise ImproperlyConfigured("%s cannot exclude the field " "'%s' - this is the foreign key to the parent model " diff --git a/tests/regressiontests/admin_validation/models.py b/tests/regressiontests/admin_validation/models.py index 08d8d94b4f..5506114841 100644 --- a/tests/regressiontests/admin_validation/models.py +++ b/tests/regressiontests/admin_validation/models.py @@ -20,7 +20,7 @@ class Song(models.Model): return self.title -class Model11709(models.Model): +class TwoAlbumFKAndAnE(models.Model): album1 = models.ForeignKey(Album, related_name="album1_set") album2 = models.ForeignKey(Album, related_name="album2_set") e = models.CharField(max_length=1) @@ -72,11 +72,27 @@ ImproperlyConfigured: SongInline cannot exclude the field 'album' - this is the # given) make sure fk_name is honored or things blow up when there is more # than one fk to the parent model. ->>> class Model11709Inline(admin.TabularInline): -... model = Model11709 +>>> class TwoAlbumFKAndAnEInline(admin.TabularInline): +... model = TwoAlbumFKAndAnE ... exclude = ("e",) ... fk_name = "album1" ->>> validate_inline(Model11709Inline, None, Album) +>>> validate_inline(TwoAlbumFKAndAnEInline, None, Album) + +# Ensure inlines validate that they can be used correctly. + +>>> class TwoAlbumFKAndAnEInline(admin.TabularInline): +... model = TwoAlbumFKAndAnE + +>>> validate_inline(TwoAlbumFKAndAnEInline, None, Album) +Traceback (most recent call last): + ... +Exception: has more than 1 ForeignKey to + +>>> class TwoAlbumFKAndAnEInline(admin.TabularInline): +... model = TwoAlbumFKAndAnE +... fk_name = "album1" + +>>> validate_inline(TwoAlbumFKAndAnEInline, None, Album) """}