diff --git a/django/views/debug.py b/django/views/debug.py index 66453fe2c6..8f7f9dc00a 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -483,7 +483,7 @@ def technical_404_response(request, exception): or (request.path == '/' and len(tried) == 1 # default URLconf and len(tried[0]) == 1 - and tried[0][0].app_name == tried[0][0].namespace == 'admin')): + and getattr(tried[0][0], 'app_name', '') == getattr(tried[0][0], 'namespace', '') == 'admin')): return default_urlconf(request) urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) diff --git a/tests/view_tests/default_urls.py b/tests/view_tests/default_urls.py new file mode 100644 index 0000000000..511689ccb1 --- /dev/null +++ b/tests/view_tests/default_urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import patterns, include, url + +from django.contrib import admin + +urlpatterns = patterns('', + # This is the same as in the default project template + url(r'^admin/', include(admin.site.urls)), +) diff --git a/tests/view_tests/regression_21530_urls.py b/tests/view_tests/regression_21530_urls.py new file mode 100644 index 0000000000..14248d872b --- /dev/null +++ b/tests/view_tests/regression_21530_urls.py @@ -0,0 +1,5 @@ +from django.conf.urls import patterns, url + +urlpatterns = patterns('', + url(r'^index/$', 'view_tests.views.index_page', name='index'), +) diff --git a/tests/view_tests/tests/test_debug.py b/tests/view_tests/tests/test_debug.py index 7be5b43a96..1f84933261 100644 --- a/tests/view_tests/tests/test_debug.py +++ b/tests/view_tests/tests/test_debug.py @@ -139,6 +139,35 @@ class DebugViewTests(TestCase): """ self.assertRaises(TemplateDoesNotExist, self.client.get, '/render_no_template/') + @override_settings(ROOT_URLCONF='view_tests.default_urls') + def test_default_urlconf_template(self): + """ + Make sure that the default urlconf template is shown shown instead + of the technical 404 page, if the user has not altered their + url conf yet. + """ + response = self.client.get('/') + self.assertContains( + response, + "

Congratulations on your first Django-powered page.

" + ) + + @override_settings(ROOT_URLCONF='view_tests.regression_21530_urls') + def test_regression_21530(self): + """ + Regression test for bug #21530. + + If the admin app include is replaced with exactly one url + pattern, then the technical 404 template should be displayed. + + The bug here was that an AttributeError caused a 500 response. + """ + response = self.client.get('/') + self.assertContains( + response, + "Page not found (404)", + status_code=404 + ) class ExceptionReporterTests(TestCase): rf = RequestFactory()