From 624caace17dbb9e22f5a4c6c08937d68cbdbb066 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Wed, 1 Apr 2009 22:46:46 +0000 Subject: [PATCH] Fixed #9005: don't wig out when reversing a URL if SETTINGS_MODULE isn't set. While I was there, I fixed #10599 by re-raising the original error message, which is almost always a better idea. Thanks, Eric git-svn-id: http://code.djangoproject.com/svn/django/trunk@10350 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/management/__init__.py | 2 +- django/template/defaulttags.py | 19 +++++++++++++------ tests/regressiontests/templates/tests.py | 15 +++++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/django/core/management/__init__.py b/django/core/management/__init__.py index 4b40009e76..151b94ec45 100644 --- a/django/core/management/__init__.py +++ b/django/core/management/__init__.py @@ -323,7 +323,7 @@ def setup_environ(settings_mod, original_settings_path=None): else: os.environ['DJANGO_SETTINGS_MODULE'] = '%s.%s' % (project_name, settings_name) - # Import the project module. We add the parent directory to PYTHONPATH to + # Import the project module. We add the parent directory to PYTHONPATH to # avoid some of the path errors new users can have. sys.path.append(os.path.join(project_directory, os.pardir)) project_module = import_module(project_name) diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index c08ecc435c..c375b5bb1e 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -370,14 +370,21 @@ class URLNode(Node): url = '' try: url = reverse(self.view_name, args=args, kwargs=kwargs) - except NoReverseMatch: - project_name = settings.SETTINGS_MODULE.split('.')[0] - try: - url = reverse(project_name + '.' + self.view_name, + except NoReverseMatch, e: + if settings.SETTINGS_MODULE: + project_name = settings.SETTINGS_MODULE.split('.')[0] + try: + url = reverse(project_name + '.' + self.view_name, args=args, kwargs=kwargs) - except NoReverseMatch: + except NoReverseMatch: + if self.asvar is None: + # Re-raise the original exception, not the one with + # the path relative to the project. This makes a + # better error message. + raise e + else: if self.asvar is None: - raise + raise e if self.asvar: context[self.asvar] = url diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 042aba2f65..cdd499ec83 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -153,6 +153,21 @@ class Templates(unittest.TestCase): split = token.split_contents() self.assertEqual(split, ["sometag", '_("Page not found")', 'value|yesno:_("yes,no")']) + def test_url_reverse_no_settings_module(self): + #Regression test for #9005 + from django.template import Template, Context, TemplateSyntaxError + old_settings_module = settings.SETTINGS_MODULE + settings.SETTINGS_MODULE = None + t = Template('{% url will_not_match %}') + c = Context() + try: + rendered = t.render(c) + except TemplateSyntaxError, e: + #Assert that we are getting the template syntax error and not the + #string encoding error. + self.assertEquals(e.message, "Caught an exception while rendering: Reverse for 'will_not_match' with arguments '()' and keyword arguments '{}' not found.") + settings.SETTINGS_MODULE = old_settings_module + def test_templates(self): template_tests = self.get_template_tests() filter_tests = filters.get_filter_tests()