diff options
| author | Angus Holder <aholder97@gmail.com> | 2020-11-14 17:25:57 +0000 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-06-09 09:06:42 +0200 |
| commit | 3e73c65ffcf263d5ccd107589452a4615281a0e8 (patch) | |
| tree | 8dc22276119e1ef908452d4b1a6a37ad3932e54b /django/urls | |
| parent | 8f89454bbc873a117cc8614f2d1f1fbfd4e79ee4 (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.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: |
