﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
33426	ResolverMatch repr is incorrect for Class Based Views	Keryn Knight	Keryn Knight	"The following test applies cleanly to 3.2.9, and AFAIK would apply roughly correctly all the way back to when CBVs were introduced (I can't easily test without going back to a super old Python and finding the test cases, which have moved around):
{{{
""""""
add to class: tests.urlpatterns_reverse.tests.ResolverMatchTests
""""""
    @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/)"",
        )
}}}

The `_func_path` as AFAIK always been a representation to the fully qualified dotted callable where possible, that is for a CBV it's the CBV module + the class name.

As of 4.0, the `_func_path` has become `urlpatterns_reverse.views.view`, I believe because of #32260 removing the use of `update_wrapper` and intentionally not setting the `__name__` and `__qualname__` in favour using the `view_class` attribute, as per the comment ''view_class should be used to robustly determine the name of the view'' (see [https://github.com/django/django/pull/14124 Pull Request])

Unfortunately I think that means the detection of class based views in `ResolverMatch` no longer works correctly, and this can probably only be resolved by making `ResolverMatch` CBV aware again by embedding detection of `view_class` therein.

Noted it as a question in [https://github.com/django/django/pull/15286 this PR] for ticket #33396, but hoisting it here properly to be considered separately.

The fix appears to ostensibly the same as for #33425 (see [https://github.com/django/django/pull/15292 PR])
{{{
class ResolverMatch:
    def __init__(...):
        # ...
        if hasattr(func, 'view_class'):
            func = func.view_class
        if not hasattr(func, '__name__'):
        # ...
}}}

I have a branch which I shall push shortly to confirm it works generally."	Bug	closed	Core (URLs)	4.0	Release blocker	fixed			Ready for checkin	1	0	0	0	0	0
