From f247c66bb5f95541d16143ef37452bb1dfeacc3e Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Mon, 24 Aug 2020 08:58:36 +0200 Subject: [PATCH] [3.1.x] Refs #31877 -- Reverted "Fixes #31877 -- Used lazy() for TemplateView kwarg deprecation warning." This reverts commit 20799cc0a6d98816b9ef0577e24691bd26b80d7d. Backport of 04e87e79a0bd2b1b9fdc30f884a637a3268733f0 from master --- django/views/generic/base.py | 5 +++-- docs/releases/3.1.1.txt | 4 ---- tests/generic_views/test_base.py | 22 ++-------------------- 3 files changed, 5 insertions(+), 26 deletions(-) diff --git a/django/views/generic/base.py b/django/views/generic/base.py index 7e5c06874da..ea5baca08d7 100644 --- a/django/views/generic/base.py +++ b/django/views/generic/base.py @@ -11,7 +11,7 @@ from django.template.response import TemplateResponse from django.urls import reverse from django.utils.decorators import classonlymethod from django.utils.deprecation import RemovedInDjango40Warning -from django.utils.functional import lazy +from django.utils.functional import SimpleLazyObject logger = logging.getLogger('django.request') @@ -169,6 +169,7 @@ def _wrap_url_kwargs_with_deprecation_warning(url_kwargs): context_kwargs = {} for key, value in url_kwargs.items(): # Bind into function closure. + @SimpleLazyObject def access_value(key=key, value=value): warnings.warn( 'TemplateView passing URL kwargs to the context is ' @@ -177,7 +178,7 @@ def _wrap_url_kwargs_with_deprecation_warning(url_kwargs): RemovedInDjango40Warning, stacklevel=2, ) return value - context_kwargs[key] = lazy(access_value, type(value))() + context_kwargs[key] = access_value return context_kwargs diff --git a/docs/releases/3.1.1.txt b/docs/releases/3.1.1.txt index d2c08fed5a1..0a0eeb461a9 100644 --- a/docs/releases/3.1.1.txt +++ b/docs/releases/3.1.1.txt @@ -26,10 +26,6 @@ Bugfixes related fields pointing to a proxy model in the ``of`` argument, the corresponding model was not locked (:ticket:`31866`). -* Fixed a regression in Django 3.1 that caused a crash when passing deprecated - keyword arguments to a queryset in ``TemplateView.get_context_data()`` - (:ticket:`31877`). - * Fixed a data loss possibility, following a regression in Django 2.0, when copying model instances with a cached fields value (:ticket:`31863`). diff --git a/tests/generic_views/test_base.py b/tests/generic_views/test_base.py index eeb9fd08d09..d498d23a680 100644 --- a/tests/generic_views/test_base.py +++ b/tests/generic_views/test_base.py @@ -3,8 +3,7 @@ import time from django.core.exceptions import ImproperlyConfigured from django.http import HttpResponse from django.test import ( - RequestFactory, SimpleTestCase, TestCase, ignore_warnings, - override_settings, + RequestFactory, SimpleTestCase, ignore_warnings, override_settings, ) from django.test.utils import require_jinja2 from django.urls import resolve @@ -12,7 +11,6 @@ from django.utils.deprecation import RemovedInDjango40Warning from django.views.generic import RedirectView, TemplateView, View from . import views -from .models import Artist class SimpleView(View): @@ -573,9 +571,7 @@ class SingleObjectTemplateResponseMixinTest(SimpleTestCase): @override_settings(ROOT_URLCONF='generic_views.urls') -class DeprecationTests(TestCase): - rf = RequestFactory() - +class DeprecationTests(SimpleTestCase): @ignore_warnings(category=RemovedInDjango40Warning) def test_template_params(self): """A generic template view passes kwargs as context.""" @@ -607,17 +603,3 @@ class DeprecationTests(TestCase): str(response.context['foo2']) self.assertEqual(response.context['key'], 'value') self.assertIsInstance(response.context['view'], View) - - @ignore_warnings(category=RemovedInDjango40Warning) - def test_template_params_filtering(self): - class ArtistView(TemplateView): - template_name = 'generic_views/about.html' - - def get_context_data(self, *, artist_name, **kwargs): - context = super().get_context_data(**kwargs) - artist = Artist.objects.get(name=artist_name) - return {**context, 'artist': artist} - - artist = Artist.objects.create(name='Rene Magritte') - response = ArtistView.as_view()(self.rf.get('/'), artist_name=artist.name) - self.assertEqual(response.context_data['artist'], artist)