diff options
Diffstat (limited to 'django/urls')
| -rw-r--r-- | django/urls/conf.py | 8 | ||||
| -rw-r--r-- | django/urls/resolvers.py | 17 |
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: |
