Commit 62353e8f authored by Joseph Kocherhans's avatar Joseph Kocherhans
Browse files

Fixed #9863. A ForeignKey with editable=False to the parent in an inline no...

Fixed #9863. A ForeignKey with editable=False to the parent in an inline no longer raises an exception. Thanks to keithb for the test case and Alex Gaynor for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10239 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 5c9d5434
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -545,7 +545,11 @@ class BaseInlineFormSet(BaseModelFormSet):
        if self._pk_field == self.fk:
            form.fields[self._pk_field.name] = InlineForeignKeyField(self.instance, pk_field=True)
        else:
            form.fields[self.fk.name] = InlineForeignKeyField(self.instance, label=form.fields[self.fk.name].label)
            # The foreign key field might not be on the form, so we poke at the
            # Model field to get the label, since we need that for error messages.
            form.fields[self.fk.name] = InlineForeignKeyField(self.instance,
                label=getattr(form.fields.get(self.fk.name), 'label', capfirst(self.fk.verbose_name))
            )

def _get_foreign_key(parent_model, model, fk_name=None):
    """
+15 −0
Original line number Diff line number Diff line
@@ -248,6 +248,20 @@ class PodcastAdmin(admin.ModelAdmin):

    ordering = ('name',)

class Parent(models.Model):
    name = models.CharField(max_length=128)

class Child(models.Model):
    parent = models.ForeignKey(Parent, editable=False)
    name = models.CharField(max_length=30, blank=True)

class ChildInline(admin.StackedInline):
    model = Child

class ParentAdmin(admin.ModelAdmin):
    model = Parent
    inlines = [ChildInline]

admin.site.register(Article, ArticleAdmin)
admin.site.register(CustomArticle, CustomArticleAdmin)
admin.site.register(Section, inlines=[ArticleInline])
@@ -259,6 +273,7 @@ admin.site.register(Persona, PersonaAdmin)
admin.site.register(Subscriber, SubscriberAdmin)
admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin)
admin.site.register(Podcast, PodcastAdmin)
admin.site.register(Parent, ParentAdmin)

# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
# That way we cover all four cases:
+17 −0
Original line number Diff line number Diff line
@@ -946,3 +946,20 @@ class AdminActionsTest(TestCase):
        }
        response = self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data)
        self.failUnlessEqual(response.status_code, 302)

class TestInlineNotEditable(TestCase):
    fixtures = ['admin-views-users.xml']

    def setUp(self):
        result = self.client.login(username='super', password='secret')
        self.failUnlessEqual(result, True)

    def tearDown(self):
        self.client.logout()

    def test(self):
        """
        InlineModelAdmin broken?
        """
        response = self.client.get('/test_admin/admin/admin_views/parent/add/')
        self.failUnlessEqual(response.status_code, 200)