From a46d3ebfccdd47dd8c915125d0ba5f29b88ffe08 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Thu, 28 Aug 2008 19:05:14 +0000 Subject: [PATCH] Fixed #8221: added some better `NoReverseMatch` error strings. Thanks, mrts. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8672 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 1 + django/core/urlresolvers.py | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/AUTHORS b/AUTHORS index cd3190b2d7456..2428f6a9acbdf 100644 --- a/AUTHORS +++ b/AUTHORS @@ -383,6 +383,7 @@ answer newbie questions, and generally made Django that much better: Swaroop C H Aaron Swartz Ville Säävuori + Mart Sõmermaa Christian Tanzer Tyler Tarabula Tyson Tate diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 950d387caa0c8..c861c703a3ccd 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -52,6 +52,8 @@ def get_callable(lookup_view, can_fail=False): mod_name, func_name = get_mod_func(lookup_view) if func_name != '': lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name) + if not callable(lookup_view): + raise AttributeError("'%s.%s' is not a callable." % (mod_name, func_name)) except (ImportError, AttributeError): if not can_fail: raise @@ -196,10 +198,12 @@ def reverse(self, viewname, *args, **kwargs): mod_name, func_name = get_mod_func(viewname) try: lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name) - except (ImportError, AttributeError): - raise NoReverseMatch + except ImportError, e: + raise NoReverseMatch("Could not import '%s': %s" % (mod_name, e)) + except AttributeError, e: + raise NoReverseMatch("'%s' has no attribute '%s'" % (mod_name, func_name)) if lookup_view != self.callback: - raise NoReverseMatch + raise NoReverseMatch("Reversed view '%s' doesn't match the expected callback ('%s')." % (viewname, self.callback)) return self.reverse_helper(*args, **kwargs) def reverse_helper(self, *args, **kwargs): @@ -279,11 +283,12 @@ def resolve500(self): def reverse(self, lookup_view, *args, **kwargs): try: lookup_view = get_callable(lookup_view, True) - except (ImportError, AttributeError): - raise NoReverseMatch("'%s' is not a callable." % lookup_view) + except (ImportError, AttributeError), e: + raise NoReverseMatch("Error importing '%s': %s." % (lookup_view, e)) if lookup_view in self.reverse_dict: return u''.join([reverse_helper(part.regex, *args, **kwargs) for part in self.reverse_dict[lookup_view]]) - raise NoReverseMatch("Reverse for '%s' not found." % lookup_view) + raise NoReverseMatch("Reverse for '%s' with arguments '%s' and keyword " + "arguments '%s' not found." % (lookup_view, args, kwargs)) def reverse_helper(self, lookup_view, *args, **kwargs): sub_match = self.reverse(lookup_view, *args, **kwargs)