diff --git a/django/contrib/admin/validation.py b/django/contrib/admin/validation.py index 50e41437b8..758090f896 100644 --- a/django/contrib/admin/validation.py +++ b/django/contrib/admin/validation.py @@ -169,7 +169,7 @@ def validate_inline(cls, parent, parent_model): # exclude if hasattr(cls, 'exclude') and cls.exclude: - fk = _get_foreign_key(parent_model, cls.model, can_fail=True) + 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 1ff89e2502..08d8d94b4f 100644 --- a/tests/regressiontests/admin_validation/models.py +++ b/tests/regressiontests/admin_validation/models.py @@ -4,9 +4,11 @@ Tests of ModelAdmin validation logic. from django.db import models + class Album(models.Model): title = models.CharField(max_length=150) + class Song(models.Model): title = models.CharField(max_length=150) album = models.ForeignKey(Album) @@ -17,11 +19,19 @@ class Song(models.Model): def __unicode__(self): return self.title + +class Model11709(models.Model): + album1 = models.ForeignKey(Album, related_name="album1_set") + album2 = models.ForeignKey(Album, related_name="album2_set") + e = models.CharField(max_length=1) + + + __test__ = {'API_TESTS':""" >>> from django import forms >>> from django.contrib import admin ->>> from django.contrib.admin.validation import validate +>>> from django.contrib.admin.validation import validate, validate_inline # Regression test for #8027: custom ModelForms with fields/fieldsets @@ -58,4 +68,15 @@ Traceback (most recent call last): ... ImproperlyConfigured: SongInline cannot exclude the field 'album' - this is the foreign key to the parent model Album. +# Regression test for #11709 - when testing for fk excluding (when exclude is +# 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 +... exclude = ("e",) +... fk_name = "album1" + +>>> validate_inline(Model11709Inline, None, Album) + """}