diff --git a/django/contrib/admin/models.py b/django/contrib/admin/models.py index f3be6530bf..dc282b7e57 100644 --- a/django/contrib/admin/models.py +++ b/django/contrib/admin/models.py @@ -4,7 +4,7 @@ from django.db import models from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.contrib.admin.util import quote -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, NoReverseMatch from django.utils.translation import ugettext, ugettext_lazy as _ from django.utils.encoding import smart_text from django.utils.encoding import python_2_unicode_compatible @@ -74,5 +74,8 @@ class LogEntry(models.Model): """ if self.content_type and self.object_id: url_name = 'admin:%s_%s_change' % (self.content_type.app_label, self.content_type.model) - return reverse(url_name, args=(quote(self.object_id),)) + try: + return reverse(url_name, args=(quote(self.object_id),)) + except NoReverseMatch: + pass return None diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index 8b44d0dcd2..3ee06751fb 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -1533,6 +1533,17 @@ class AdminViewStringPrimaryKeyTest(TestCase): self.assertEqual(counted_presence_before - 1, counted_presence_after) + def test_logentry_get_admin_url(self): + "LogEntry.get_admin_url returns a URL to edit the entry's object or None for non-existent (possibly deleted) models" + log_entry_name = "Model with string primary key" # capitalized in Recent Actions + logentry = LogEntry.objects.get(content_type__name__iexact=log_entry_name) + model = "modelwithstringprimarykey" + desired_admin_url = "/test_admin/admin/admin_views/%s/%s/" % (model, escape(iri_to_uri(urlquote(quote(self.pk))))) + self.assertEqual(logentry.get_admin_url(), desired_admin_url) + + logentry.content_type.model = "non-existent" + self.assertEqual(logentry.get_admin_url(), None) + def test_deleteconfirmation_link(self): "The link from the delete confirmation page referring back to the changeform of the object should be quoted" response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/delete/' % quote(self.pk))