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
This commit is contained in:
Jacob Kaplan-Moss 2009-04-01 22:46:46 +00:00
parent dc832d7753
commit 624caace17
3 changed files with 29 additions and 7 deletions

View File

@ -370,14 +370,21 @@ class URLNode(Node):
url = '' url = ''
try: try:
url = reverse(self.view_name, args=args, kwargs=kwargs) url = reverse(self.view_name, args=args, kwargs=kwargs)
except NoReverseMatch: except NoReverseMatch, e:
project_name = settings.SETTINGS_MODULE.split('.')[0] if settings.SETTINGS_MODULE:
try: project_name = settings.SETTINGS_MODULE.split('.')[0]
url = reverse(project_name + '.' + self.view_name, try:
url = reverse(project_name + '.' + self.view_name,
args=args, kwargs=kwargs) 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: if self.asvar is None:
raise raise e
if self.asvar: if self.asvar:
context[self.asvar] = url context[self.asvar] = url

View File

@ -153,6 +153,21 @@ class Templates(unittest.TestCase):
split = token.split_contents() split = token.split_contents()
self.assertEqual(split, ["sometag", '_("Page not found")', 'value|yesno:_("yes,no")']) 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): def test_templates(self):
template_tests = self.get_template_tests() template_tests = self.get_template_tests()
filter_tests = filters.get_filter_tests() filter_tests = filters.get_filter_tests()