Browse Source

Merge pull request #127 from dhepper/master

Fixed #18433 -- Fixed "View on Site" link in inline admin for models with custom PK

Thanks dhepper for the patch and apollo13 for the review.
Aymeric Augustin 12 years ago
parent
commit
c1729510aa

+ 1 - 1
django/contrib/admin/templates/admin/edit_inline/stacked.html

@@ -6,7 +6,7 @@
 
 {% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if forloop.last %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
   <h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b>&nbsp;<span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% else %}#{{ forloop.counter }}{% endif %}</span>
-    {% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %}
+    {% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.pk }}/">{% trans "View on site" %}</a>{% endif %}
     {% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %}
   </h3>
   {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %}

+ 1 - 1
django/contrib/admin/templates/admin/edit_inline/tabular.html

@@ -27,7 +27,7 @@
         <td class="original">
           {% if inline_admin_form.original or inline_admin_form.show_url %}<p>
           {% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %}
-          {% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %}
+          {% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.pk }}/">{% trans "View on site" %}</a>{% endif %}
             </p>{% endif %}
           {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
           {{ inline_admin_form.fk_field.field }}

+ 12 - 1
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])
+site.register(ProfileCollection, inlines=[ProfileInline])
+site.register(ParentModelWithCustomPk, inlines=[ChildModel1Inline, ChildModel2Inline])

+ 25 - 0
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):

+ 16 - 1
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):
                 '<input id="id_-2-0-name" type="text" class="vTextField" '
                 'name="-2-0-name" maxlength="100" />', 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"