diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 9eaa9e5851fc0..c0cfc2fad61e0 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -186,11 +186,11 @@ def __call__(self, request, url): # Delegate to the appropriate method, based on the URL. if url is None: return self.changelist_view(request) - elif url.endswith('add'): + elif url == "add": return self.add_view(request) - elif url.endswith('history'): + elif url.endswith('/history'): return self.history_view(request, unquote(url[:-8])) - elif url.endswith('delete'): + elif url.endswith('/delete'): return self.delete_view(request, unquote(url[:-7])) else: return self.change_view(request, unquote(url)) diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index d16889f45a784..56937d8462a8d 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -458,6 +458,31 @@ def test_deleteconfirmation_link(self): response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/delete/' % quote(self.pk)) should_contain = """%s""" % (quote(self.pk), escape(self.pk)) self.assertContains(response, should_contain) + + def test_url_conflicts_with_add(self): + "A model with a primary key that ends with add should be visible" + add_model = ModelWithStringPrimaryKey(id="i have something to add") + add_model.save() + response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(add_model.pk)) + should_contain = """

Change model with string primary key

""" + self.assertContains(response, should_contain) + + def test_url_conflicts_with_delete(self): + "A model with a primary key that ends with delete should be visible" + delete_model = ModelWithStringPrimaryKey(id="delete") + delete_model.save() + response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(delete_model.pk)) + should_contain = """

Change model with string primary key

""" + self.assertContains(response, should_contain) + + def test_url_conflicts_with_history(self): + "A model with a primary key that ends with history should be visible" + history_model = ModelWithStringPrimaryKey(id="history") + history_model.save() + response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(history_model.pk)) + should_contain = """

Change model with string primary key

""" + self.assertContains(response, should_contain) + class SecureViewTest(TestCase): fixtures = ['admin-views-users.xml']