Loading django/core/urlresolvers.py +5 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,11 @@ def get_callable(lookup_view, can_fail=False): if callable(lookup_view): return lookup_view if not isinstance(lookup_view, six.string_types): raise ViewDoesNotExist( "'%s' is not a callable or a dot-notation path" % lookup_view ) mod_name, func_name = get_mod_func(lookup_view) if not func_name: # No '.' in lookup_view if can_fail: Loading tests/urlpatterns_reverse/erroneous_urls.py +4 −2 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ with warnings.catch_warnings(): url(r'erroneous_unqualified/$', 'unqualified_view'), # View does not exist url(r'missing_inner/$', 'urlpatterns_reverse.views.missing_view'), # View is not callable url(r'uncallable/$', 'urlpatterns_reverse.views.uncallable'), # View is not a callable (string import; arbitrary Python object) url(r'uncallable-dotted/$', 'urlpatterns_reverse.views.uncallable'), # View is not a callable (explicit import; arbitrary Python object) url(r'uncallable-object/$', views.uncallable), # Module does not exist url(r'missing_outer/$', 'urlpatterns_reverse.missing_module.missing_view'), # Regex contains an error (refs #6170) Loading tests/urlpatterns_reverse/tests.py +2 −1 Original line number Diff line number Diff line Loading @@ -762,7 +762,8 @@ class ErroneousViewTests(TestCase): self.assertRaises(ImportError, self.client.get, '/erroneous_outer/') self.assertRaises(ViewDoesNotExist, self.client.get, '/missing_inner/') self.assertRaises(ViewDoesNotExist, self.client.get, '/missing_outer/') self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable/') self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable-dotted/') self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable-object/') # Regression test for #21157 self.assertRaises(ImportError, self.client.get, '/erroneous_unqualified/') Loading tests/urlpatterns_reverse/views.py +1 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ def pass_resolver_match_view(request, *args, **kwargs): response.resolver_match = request.resolver_match return response uncallable = "Can I be a view? Pleeeease?" uncallable = None # neither a callable nor a string class ViewClass(object): Loading Loading
django/core/urlresolvers.py +5 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,11 @@ def get_callable(lookup_view, can_fail=False): if callable(lookup_view): return lookup_view if not isinstance(lookup_view, six.string_types): raise ViewDoesNotExist( "'%s' is not a callable or a dot-notation path" % lookup_view ) mod_name, func_name = get_mod_func(lookup_view) if not func_name: # No '.' in lookup_view if can_fail: Loading
tests/urlpatterns_reverse/erroneous_urls.py +4 −2 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ with warnings.catch_warnings(): url(r'erroneous_unqualified/$', 'unqualified_view'), # View does not exist url(r'missing_inner/$', 'urlpatterns_reverse.views.missing_view'), # View is not callable url(r'uncallable/$', 'urlpatterns_reverse.views.uncallable'), # View is not a callable (string import; arbitrary Python object) url(r'uncallable-dotted/$', 'urlpatterns_reverse.views.uncallable'), # View is not a callable (explicit import; arbitrary Python object) url(r'uncallable-object/$', views.uncallable), # Module does not exist url(r'missing_outer/$', 'urlpatterns_reverse.missing_module.missing_view'), # Regex contains an error (refs #6170) Loading
tests/urlpatterns_reverse/tests.py +2 −1 Original line number Diff line number Diff line Loading @@ -762,7 +762,8 @@ class ErroneousViewTests(TestCase): self.assertRaises(ImportError, self.client.get, '/erroneous_outer/') self.assertRaises(ViewDoesNotExist, self.client.get, '/missing_inner/') self.assertRaises(ViewDoesNotExist, self.client.get, '/missing_outer/') self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable/') self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable-dotted/') self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable-object/') # Regression test for #21157 self.assertRaises(ImportError, self.client.get, '/erroneous_unqualified/') Loading
tests/urlpatterns_reverse/views.py +1 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ def pass_resolver_match_view(request, *args, **kwargs): response.resolver_match = request.resolver_match return response uncallable = "Can I be a view? Pleeeease?" uncallable = None # neither a callable nor a string class ViewClass(object): Loading