From f4b06a3cc1e54888ff86f36a1f9a3ddf21292314 Mon Sep 17 00:00:00 2001 From: Keryn Knight Date: Mon, 10 Jan 2022 13:01:35 +0000 Subject: [PATCH] Fixed #33426 -- Fixed ResolverMatch.__repr_() for class-based views. Regression in 7c08f26bf0439c1ed593b51b51ad847f7e262bc1. --- django/urls/resolvers.py | 2 ++ docs/releases/4.0.2.txt | 3 +++ tests/urlpatterns_reverse/tests.py | 9 +++++++++ 3 files changed, 14 insertions(+) diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py index 110ad87cdb..2ef173c2c8 100644 --- a/django/urls/resolvers.py +++ b/django/urls/resolvers.py @@ -46,6 +46,8 @@ class ResolverMatch: self.namespaces = [x for x in namespaces if x] if namespaces else [] self.namespace = ':'.join(self.namespaces) + if hasattr(func, 'view_class'): + func = func.view_class if not hasattr(func, '__name__'): # A class-based view self._func_path = func.__class__.__module__ + '.' + func.__class__.__name__ diff --git a/docs/releases/4.0.2.txt b/docs/releases/4.0.2.txt index 71bb71e91d..b191ef10e3 100644 --- a/docs/releases/4.0.2.txt +++ b/docs/releases/4.0.2.txt @@ -17,3 +17,6 @@ Bugfixes * Fixed a regression in Django 4.0 that caused displaying an incorrect name for class-based views on the technical 404 debug page (:ticket:`33425`). + +* Fixed a regression in Django 4.0 that caused an incorrect ``repr`` of + ``ResolverMatch`` for class-based views (:ticket:`33426`). diff --git a/tests/urlpatterns_reverse/tests.py b/tests/urlpatterns_reverse/tests.py index 332bc19e76..5ee4c7a52b 100644 --- a/tests/urlpatterns_reverse/tests.py +++ b/tests/urlpatterns_reverse/tests.py @@ -1148,6 +1148,15 @@ class ResolverMatchTests(SimpleTestCase): "namespaces=[], route='^no_kwargs/([0-9]+)/([0-9]+)/$')", ) + @override_settings(ROOT_URLCONF='urlpatterns_reverse.reverse_lazy_urls') + def test_classbased_repr(self): + self.assertEqual( + repr(resolve('/redirect/')), + "ResolverMatch(func=urlpatterns_reverse.views.LazyRedirectView, " + "args=(), kwargs={}, url_name=None, app_names=[], " + "namespaces=[], route='redirect/')", + ) + @override_settings(ROOT_URLCONF='urlpatterns_reverse.urls') def test_repr_functools_partial(self): tests = [