8000 Fixed #24707 -- Improved error reporting for explicitly imported unca… · ddriddle/django@40768ec · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 40768ec

Browse files
hjwpMarkusH
authored andcommitted
Fixed #24707 -- Improved error reporting for explicitly imported uncallable views
1 parent 86aaffa commit 40768ec

File tree

4 files changed

+12
-4
lines changed

4 files changed

+12
-4
lines changed

django/core/urlresolvers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ def get_callable(lookup_view, can_fail=False):
9494
if callable(lookup_view):
9595
return lookup_view
9696

97+
if not isinstance(lookup_view, six.string_types):
98+
raise ViewDoesNotExist(
99+
"'%s' is not a callable or a dot-notation path" % lookup_view
100+
)
101+
97102
mod_name, func_name = get_mod_func(lookup_view)
98103
if not func_name: # No '.' in lookup_view
99104
if can_fail:

tests/urlpatterns_reverse/erroneous_urls.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
url(r'erroneous_unqualified/$', 'unqualified_view'),
2020
# View does not exist
2121
url(r'missing_inner/$', 'urlpatterns_reverse.views.missing_view'),
22-
# View is not callable
23-
url(r'uncallable/$', 'urlpatterns_reverse.views.uncallable'),
22+
# View is not a callable (string import; arbitrary Python object)
23+
url(r'uncallable-dotted/$', 'urlpatterns_reverse.views.uncallable'),
24+
# View is not a callable (explicit import; arbitrary Python object)
25+
url(r'uncallable-object/$', views.uncallable),
2426
# Module does not exist
2527
url(r'missing_outer/$', 'urlpatterns_reverse.missing_module.missing_view'),
2628
# Regex contains an error (refs #6170)

tests/urlpatterns_reverse/tests.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,8 @@ def test_erroneous_resolve(self):
762762
self.assertRaises(ImportError, self.client.get, '/erroneous_outer/')
763763
self.assertRaises(ViewDoesNotExist, self.client.get, '/missing_inner/')
764764
self.assertRaises(ViewDoesNotExist, self.client.get, '/missing_outer/')
765-
self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable/')
765+
self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable-dotted/')
766+
self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable-object/')
766767

767768
# Regression test for #21157
768769
self.assertRaises(ImportError, self.client.get, '/erroneous_unqualified/')

tests/urlpatterns_reverse/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def pass_resolver_match_view(request, *args, **kwargs):
3535
response.resolver_match = request.resolver_match
3636
return response
3737

38-
uncallable = "Can I be a view? Pleeeease?"
38+
uncallable = None # neither a callable nor a string
3939

4040

4141
class ViewClass(object):

0 commit comments

Comments
 (0)
0