From b917458f4752e98dc7866261f40e296de3701130 Mon Sep 17 00:00:00 2001
From: Russell Keith-Magee <russell@keith-magee.com>
Date: Fri, 6 Sep 2013 15:06:57 -0700
Subject: [PATCH] Merge pull request #1579 from ianawilson/ticket_21058

[1.6.x] Fixed #21058 -- Fixed debug view blowing up when no template is provided to the template rendering functions.

Assistance on this commit from @jambonrose.

Backport of 122020fdb93980df850ae02f61d97da27e2cb515 from master.
---
 AUTHORS                              | 2 ++
 django/views/debug.py                | 4 ++++
 tests/view_tests/tests/test_debug.py | 7 +++++++
 tests/view_tests/urls.py             | 1 +
 tests/view_tests/views.py            | 5 +++++
 5 files changed, 19 insertions(+)

diff --git a/AUTHORS b/AUTHORS
index e2598ddbad..a32d0cfe5b 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -465,6 +465,7 @@ answer newbie questions, and generally made Django that much better:
     phil@produxion.net
     phil.h.smith@gmail.com
     Gustavo Picon
+    Andrew Pinkham <http://AndrewsForge.com>
     Travis Pinney
     Michael Placentra II <someone@michaelplacentra2.net>
     plisk
@@ -626,6 +627,7 @@ answer newbie questions, and generally made Django that much better:
     Derek Willis <http://blog.thescoop.org/>
     Rachel Willmer <http://www.willmer.com/kb/>
     Jakub Wilk <ubanus@users.sf.net>
+    Ian A Wilson <http://ianawilson.com>
     Jakub Wiśniowski <restless.being@gmail.com>
     Maciej Wiśniowski <pigletto@gmail.com>
     wojtek
diff --git a/django/views/debug.py b/django/views/debug.py
index 2129a83d67..b9fe8f2969 100644
--- a/django/views/debug.py
+++ b/django/views/debug.py
@@ -233,6 +233,10 @@ class ExceptionReporter(object):
             from django.template.loader import template_source_loaders
             self.template_does_not_exist = True
             self.loader_debug_info = []
+            # If the template_source_loaders haven't been populated yet, you need
+            # to provide an empty list for this for loop to not fail.
+            if template_source_loaders is None:
+                template_source_loaders = []
             for loader in template_source_loaders:
                 try:
                     source_list_func = loader.get_template_sources
diff --git a/tests/view_tests/tests/test_debug.py b/tests/view_tests/tests/test_debug.py
index f686eee0e0..0baddd2bf8 100644
--- a/tests/view_tests/tests/test_debug.py
+++ b/tests/view_tests/tests/test_debug.py
@@ -12,6 +12,7 @@ from tempfile import NamedTemporaryFile, mkdtemp, mkstemp
 from django.core import mail
 from django.core.files.uploadedfile import SimpleUploadedFile
 from django.core.urlresolvers import reverse
+from django.template.base import TemplateDoesNotExist
 from django.test import TestCase, RequestFactory
 from django.test.utils import (override_settings, setup_test_template_loader,
     restore_template_loaders)
@@ -113,6 +114,12 @@ class DebugViewTests(TestCase):
         finally:
             shutil.rmtree(template_path)
 
+    def test_no_template_source_loaders(self):
+        """
+        Make sure if you don't specify a template, the debug view doesn't blow up.
+        """
+        self.assertRaises(TemplateDoesNotExist, self.client.get, '/render_no_template/')
+
 
 class ExceptionReporterTests(TestCase):
     rf = RequestFactory()
diff --git a/tests/view_tests/urls.py b/tests/view_tests/urls.py
index b0c06a1e56..ff9cc5630a 100644
--- a/tests/view_tests/urls.py
+++ b/tests/view_tests/urls.py
@@ -69,4 +69,5 @@ urlpatterns += patterns('view_tests.views',
     url(r'view_exception/(?P<n>\d+)/$', 'view_exception', name='view_exception'),
     url(r'template_exception/(?P<n>\d+)/$', 'template_exception', name='template_exception'),
     url(r'^raises_template_does_not_exist/(?P<path>.+)$', 'raises_template_does_not_exist', name='raises_template_does_not_exist'),
+    url(r'^render_no_template/$', 'render_no_template', name='render_no_template'),
 )
diff --git a/tests/view_tests/views.py b/tests/view_tests/views.py
index 5fcf1703d4..2db6b09faa 100644
--- a/tests/view_tests/views.py
+++ b/tests/view_tests/views.py
@@ -123,6 +123,11 @@ def raises_template_does_not_exist(request, path='i_dont_exist.html'):
     except TemplateDoesNotExist:
         return technical_500_response(request, *sys.exc_info())
 
+def render_no_template(request):
+    # If we do not specify a template, we need to make sure the debug
+    # view doesn't blow up.
+    return render(request, [], {})
+
 def send_log(request, exc_info):
     logger = getLogger('django.request')
     # The default logging config has a logging filter to ensure admin emails are