Commit cb7a3262 authored by Brian Rosner's avatar Brian Rosner
Browse files

Moved the call to _get_foreign_key to run in all cases catching incorrect inline setup sooner.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@11631 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 5fc35c9c
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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 "
+20 −4
Original line number Diff line number Diff line
@@ -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: <class 'regressiontests.admin_validation.models.TwoAlbumFKAndAnE'> has more than 1 ForeignKey to <class 'regressiontests.admin_validation.models.Album'>

>>> class TwoAlbumFKAndAnEInline(admin.TabularInline):
...     model = TwoAlbumFKAndAnE
...     fk_name = "album1"

>>> validate_inline(TwoAlbumFKAndAnEInline, None, Album)

"""}