diff options
| author | Jacob Kaplan-Moss <jacob@jacobian.org> | 2008-08-28 19:05:14 +0000 |
|---|---|---|
| committer | Jacob Kaplan-Moss <jacob@jacobian.org> | 2008-08-28 19:05:14 +0000 |
| commit | a46d3ebfccdd47dd8c915125d0ba5f29b88ffe08 (patch) | |
| tree | 98fb78d3b8c867524a08f9e4cd9e41b1695a3a97 | |
| parent | 10244d1c040d4662e0c93ccdc9e0238d33f85ece (diff) | |
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
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/core/urlresolvers.py | 17 |
2 files changed, 12 insertions, 6 deletions
@@ -383,6 +383,7 @@ answer newbie questions, and generally made Django that much better: Swaroop C H <http://www.swaroopch.info> Aaron Swartz <http://www.aaronsw.com/> Ville Säävuori <http://www.unessa.net/> + Mart Sõmermaa <http://mrts.pri.ee/> Christian Tanzer <tanzer@swing.co.at> Tyler Tarabula <tyler.tarabula@gmail.com> Tyson Tate <tyson@fallingbullets.com> diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 950d387caa..c861c703a3 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 @@ class RegexURLPattern(object): 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 @@ class RegexURLResolver(object): 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) |
