summaryrefslogtreecommitdiff
path: root/django/urls
diff options
context:
space:
mode:
authorAngus Holder <aholder97@gmail.com>2020-11-14 17:25:57 +0000
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-06-09 09:06:42 +0200
commit3e73c65ffcf263d5ccd107589452a4615281a0e8 (patch)
tree8dc22276119e1ef908452d4b1a6a37ad3932e54b /django/urls
parent8f89454bbc873a117cc8614f2d1f1fbfd4e79ee4 (diff)
Fixed #32195 -- Added system check for invalid view in path() and improved error messages.
Diffstat (limited to 'django/urls')
-rw-r--r--django/urls/conf.py8
-rw-r--r--django/urls/resolvers.py17
2 files changed, 25 insertions, 0 deletions
diff --git a/django/urls/conf.py b/django/urls/conf.py
index 119e95df41..b3937d5512 100644
--- a/django/urls/conf.py
+++ b/django/urls/conf.py
@@ -55,6 +55,8 @@ def include(arg, namespace=None):
def _path(route, view, kwargs=None, name=None, Pattern=None):
+ from django.views import View
+
if isinstance(view, (list, tuple)):
# For include(...) processing.
pattern = Pattern(route, is_endpoint=False)
@@ -69,6 +71,12 @@ def _path(route, view, kwargs=None, name=None, Pattern=None):
elif callable(view):
pattern = Pattern(route, name=name, is_endpoint=True)
return URLPattern(pattern, view, kwargs, name)
+ elif isinstance(view, View):
+ view_cls_name = view.__class__.__name__
+ raise TypeError(
+ f'view must be a callable, pass {view_cls_name}.as_view(), not '
+ f'{view_cls_name}().'
+ )
else:
raise TypeError('view must be a callable or a list/tuple in the case of include().')
diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py
index fac77fc4bc..674fd0c58e 100644
--- a/django/urls/resolvers.py
+++ b/django/urls/resolvers.py
@@ -345,6 +345,7 @@ class URLPattern:
def check(self):
warnings = self._check_pattern_name()
warnings.extend(self.pattern.check())
+ warnings.extend(self._check_callback())
return warnings
def _check_pattern_name(self):
@@ -361,6 +362,22 @@ class URLPattern:
else:
return []
+ def _check_callback(self):
+ from django.views import View
+
+ view = self.callback
+ if inspect.isclass(view) and issubclass(view, View):
+ return [Error(
+ 'Your URL pattern %s has an invalid view, pass %s.as_view() '
+ 'instead of %s.' % (
+ self.pattern.describe(),
+ view.__name__,
+ view.__name__,
+ ),
+ id='urls.E009',
+ )]
+ return []
+
def resolve(self, path):
match = self.pattern.match(path)
if match: