diff --git a/django/contrib/admin/templates/admin/edit_inline/stacked.html b/django/contrib/admin/templates/admin/edit_inline/stacked.html index 08e8ca306d7..55463d97b14 100644 --- a/django/contrib/admin/templates/admin/edit_inline/stacked.html +++ b/django/contrib/admin/templates/admin/edit_inline/stacked.html @@ -6,7 +6,7 @@ {% for inline_admin_form in inline_admin_formset %}

{{ inline_admin_formset.opts.verbose_name|title }}: {% if inline_admin_form.original %}{{ inline_admin_form.original }}{% else %}#{{ forloop.counter }}{% endif %} - {% if inline_admin_form.show_url %}{% trans "View on site" %}{% endif %} + {% if inline_admin_form.show_url %}{% trans "View on site" %}{% endif %} {% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}{% endif %}

{% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} diff --git a/django/contrib/admin/templates/admin/edit_inline/tabular.html b/django/contrib/admin/templates/admin/edit_inline/tabular.html index 9e215afd92a..d5ac9b0fb69 100644 --- a/django/contrib/admin/templates/admin/edit_inline/tabular.html +++ b/django/contrib/admin/templates/admin/edit_inline/tabular.html @@ -27,7 +27,7 @@ {% if inline_admin_form.original or inline_admin_form.show_url %}

{% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %} - {% if inline_admin_form.show_url %}{% trans "View on site" %}{% endif %} + {% if inline_admin_form.show_url %}{% trans "View on site" %}{% endif %}

{% endif %} {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %} {{ inline_admin_form.fk_field.field }} diff --git a/tests/regressiontests/admin_inlines/admin.py b/tests/regressiontests/admin_inlines/admin.py index 79ca4413a2b..cf51fa49b44 100644 --- a/tests/regressiontests/admin_inlines/admin.py +++ b/tests/regressiontests/admin_inlines/admin.py @@ -115,6 +115,16 @@ class ProfileInline(admin.TabularInline): model = Profile extra = 1 + +# admin for #18433 +class ChildModel1Inline(admin.TabularInline): + model = ChildModel1 + + +class ChildModel2Inline(admin.StackedInline): + model = ChildModel2 + + site.register(TitleCollection, inlines=[TitleInline]) # Test bug #12561 and #12778 # only ModelAdmin media @@ -130,4 +140,5 @@ site.register(Fashionista, inlines=[InlineWeakness]) site.register(Holder4, Holder4Admin) site.register(Author, AuthorAdmin) site.register(CapoFamiglia, inlines=[ConsigliereInline, SottoCapoInline]) -site.register(ProfileCollection, inlines=[ProfileInline]) \ No newline at end of file +site.register(ProfileCollection, inlines=[ProfileInline]) +site.register(ParentModelWithCustomPk, inlines=[ChildModel1Inline, ChildModel2Inline]) \ No newline at end of file diff --git a/tests/regressiontests/admin_inlines/models.py b/tests/regressiontests/admin_inlines/models.py index d7526d60205..5a0f4d84b9a 100644 --- a/tests/regressiontests/admin_inlines/models.py +++ b/tests/regressiontests/admin_inlines/models.py @@ -139,6 +139,31 @@ class SottoCapo(models.Model): name = models.CharField(max_length=100) capo_famiglia = models.ForeignKey(CapoFamiglia, related_name='+') +# Models for #18433 + +class ParentModelWithCustomPk(models.Model): + my_own_pk = models.CharField(max_length=100, primary_key=True) + name = models.CharField(max_length=100) + + +class ChildModel1(models.Model): + my_own_pk = models.CharField(max_length=100, primary_key=True) + name = models.CharField(max_length=100) + parent = models.ForeignKey(ParentModelWithCustomPk) + + def get_absolute_url(self): + return '/child_model1/' + + +class ChildModel2(models.Model): + my_own_pk = models.CharField(max_length=100, primary_key=True) + name = models.CharField(max_length=100) + parent = models.ForeignKey(ParentModelWithCustomPk) + + def get_absolute_url(self): + return '/child_model2/' + + # Other models class ProfileCollection(models.Model): diff --git a/tests/regressiontests/admin_inlines/tests.py b/tests/regressiontests/admin_inlines/tests.py index 94790af56c0..4f25d3dbfb4 100644 --- a/tests/regressiontests/admin_inlines/tests.py +++ b/tests/regressiontests/admin_inlines/tests.py @@ -11,7 +11,7 @@ from django.test.utils import override_settings from .admin import InnerInline from .models import (Holder, Inner, Holder2, Inner2, Holder3, Inner3, Person, OutfitItem, Fashionista, Teacher, Parent, Child, Author, Book, Profile, - ProfileCollection) + ProfileCollection, ParentModelWithCustomPk, ChildModel1, ChildModel2) @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) @@ -147,6 +147,21 @@ class TestInline(TestCase): '', html=True) + def test_custom_pk_shortcut(self): + """ + Ensure that the "View on Site" link is correct for models with a + custom primary key field. Bug #18433. + """ + parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo") + child1 = ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent) + child2 = ChildModel2.objects.create(my_own_pk="baz", name="Baz", parent=parent) + response = self.client.get('/admin/admin_inlines/parentmodelwithcustompk/foo/') + child1_shortcut = 'r/%s/%s/'%(ContentType.objects.get_for_model(child1).pk, child1.pk) + child2_shortcut = 'r/%s/%s/'%(ContentType.objects.get_for_model(child2).pk, child2.pk) + self.assertContains(response, child1_shortcut) + self.assertContains(response, child2_shortcut) + + @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) class TestInlineMedia(TestCase): urls = "regressiontests.admin_inlines.urls"