Skip to content

Commit bb8f669

Browse files
committed
Fixed #31877 -- Reverted "Fixed #19878 -- Deprecated TemplateView passing URL kwargs into context."
This reverts commit 4ed5347.
1 parent 04e87e7 commit bb8f669

File tree

7 files changed

+33
-84
lines changed

7 files changed

+33
-84
lines changed

django/views/generic/base.py

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import logging
2-
import warnings
32
from functools import update_wrapper
43

54
from django.core.exceptions import ImproperlyConfigured
@@ -10,8 +9,6 @@
109
from django.template.response import TemplateResponse
1110
from django.urls import reverse
1211
from django.utils.decorators import classonlymethod
13-
from django.utils.deprecation import RemovedInDjango40Warning
14-
from django.utils.functional import SimpleLazyObject
1512

1613
logger = logging.getLogger('django.request')
1714

@@ -155,33 +152,14 @@ def get_template_names(self):
155152

156153

157154
class TemplateView(TemplateResponseMixin, ContextMixin, View):
158-
"""Render a template."""
155+
"""
156+
Render a template. Pass keyword arguments from the URLconf to the context.
157+
"""
159158
def get(self, request, *args, **kwargs):
160-
# RemovedInDjango40Warning: when the deprecation ends, replace with:
161-
# context = self.get_context_data()
162-
context_kwargs = _wrap_url_kwargs_with_deprecation_warning(kwargs)
163-
context = self.get_context_data(**context_kwargs)
159+
context = self.get_context_data(**kwargs)
164160
return self.render_to_response(context)
165161

166162

167-
# RemovedInDjango40Warning
168-
def _wrap_url_kwargs_with_deprecation_warning(url_kwargs):
169-
context_kwargs = {}
170-
for key, value in url_kwargs.items():
171-
# Bind into function closure.
172-
@SimpleLazyObject
173-
def access_value(key=key, value=value):
174-
warnings.warn(
175-
'TemplateView passing URL kwargs to the context is '
176-
'deprecated. Reference %s in your template through '
177-
'view.kwargs instead.' % key,
178-
RemovedInDjango40Warning, stacklevel=2,
179-
)
180-
return value
181-
context_kwargs[key] = access_value
182-
return context_kwargs
183-
184-
185163
class RedirectView(View):
186164
"""Provide a redirect on any GET request."""
187165
permanent = False

docs/internals/deprecation.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,6 @@ details on these changes.
9898

9999
* The ``list`` message for ``ModelMultipleChoiceField`` will be removed.
100100

101-
* ``django.views.generic.TemplateView`` will no longer pass URL kwargs directly
102-
to the ``context``.
103-
104101
* Support for passing raw column aliases to ``QuerySet.order_by()`` will be
105102
removed.
106103

docs/ref/class-based-views/base.txt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ MRO is an acronym for Method Resolution Order.
117117

118118
.. class:: django.views.generic.base.TemplateView
119119

120-
Renders a given template.
120+
Renders a given template, with the context containing parameters captured
121+
in the URL.
121122

122123
**Ancestors (MRO)**
123124

@@ -161,17 +162,12 @@ MRO is an acronym for Method Resolution Order.
161162

162163
**Context**
163164

164-
* Populated (through :class:`~django.views.generic.base.ContextMixin`).
165+
* Populated (through :class:`~django.views.generic.base.ContextMixin`) with
166+
the keyword arguments captured from the URL pattern that served the view.
165167
* You can also add context using the
166168
:attr:`~django.views.generic.base.ContextMixin.extra_context` keyword
167169
argument for :meth:`~django.views.generic.base.View.as_view`.
168170

169-
.. deprecated:: 3.1
170-
171-
Starting in Django 4.0, the keyword arguments captured from the URL
172-
pattern won't be passed to the context. Reference them with
173-
``view.kwargs`` instead.
174-
175171
``RedirectView``
176172
================
177173

docs/releases/3.1.1.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,7 @@ Bugfixes
3131

3232
* Fixed a regression in Django 3.1 that caused a crash when decoding an invalid
3333
session data (:ticket:`31895`).
34+
35+
* Reverted a deprecation in Django 3.1 that caused a crash when passing
36+
deprecated keyword arguments to a queryset in
37+
``TemplateView.get_context_data()`` (:ticket:`31877`).

docs/releases/3.1.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -798,10 +798,6 @@ Miscellaneous
798798
* The ``list`` message for :class:`~django.forms.ModelMultipleChoiceField` is
799799
deprecated in favor of ``invalid_list``.
800800

801-
* The passing of URL kwargs directly to the context by
802-
:class:`~django.views.generic.base.TemplateView` is deprecated. Reference
803-
them in the template with ``view.kwargs`` instead.
804-
805801
* Passing raw column aliases to :meth:`.QuerySet.order_by` is deprecated. The
806802
same result can be achieved by passing aliases in a
807803
:class:`~django.db.models.expressions.RawSQL` instead beforehand.

tests/generic_views/test_base.py

Lines changed: 20 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22

33
from django.core.exceptions import ImproperlyConfigured
44
from django.http import HttpResponse
5-
from django.test import (
6-
RequestFactory, SimpleTestCase, ignore_warnings, override_settings,
7-
)
5+
from django.test import RequestFactory, SimpleTestCase, override_settings
86
from django.test.utils import require_jinja2
97
from django.urls import resolve
10-
from django.utils.deprecation import RemovedInDjango40Warning
118
from django.views.generic import RedirectView, TemplateView, View
129

1310
from . import views
@@ -350,6 +347,25 @@ def test_template_engine(self):
350347
view = TemplateView.as_view(template_name='generic_views/using.html', template_engine='jinja2')
351348
self.assertEqual(view(request).render().content, b'Jinja2\n')
352349

350+
def test_template_params(self):
351+
"""
352+
A generic template view passes kwargs as context.
353+
"""
354+
response = self.client.get('/template/simple/bar/')
355+
self.assertEqual(response.status_code, 200)
356+
self.assertEqual(response.context['foo'], 'bar')
357+
self.assertIsInstance(response.context['view'], View)
358+
359+
def test_extra_template_params(self):
360+
"""
361+
A template view can be customized to return extra context.
362+
"""
363+
response = self.client.get('/template/custom/bar/')
364+
self.assertEqual(response.status_code, 200)
365+
self.assertEqual(response.context['foo'], 'bar')
366+
self.assertEqual(response.context['key'], 'value')
367+
self.assertIsInstance(response.context['view'], View)
368+
353369
def test_cached_views(self):
354370
"""
355371
A template view can be cached
@@ -568,38 +584,3 @@ def test_template_mixin_without_template(self):
568584
)
569585
with self.assertRaisesMessage(ImproperlyConfigured, msg):
570586
view.get_template_names()
571-
572-
573-
@override_settings(ROOT_URLCONF='generic_views.urls')
574-
class DeprecationTests(SimpleTestCase):
575-
@ignore_warnings(category=RemovedInDjango40Warning)
576-
def test_template_params(self):
577-
"""A generic template view passes kwargs as context."""
578-
response = self.client.get('/template/simple/bar/')
579-
self.assertEqual(response.status_code, 200)
580-
self.assertEqual(response.context['foo'], 'bar')
581-
self.assertIsInstance(response.context['view'], View)
582-
583-
@ignore_warnings(category=RemovedInDjango40Warning)
584-
def test_extra_template_params(self):
585-
"""A template view can be customized to return extra context."""
586-
response = self.client.get('/template/custom/bar1/bar2/')
587-
self.assertEqual(response.status_code, 200)
588-
self.assertEqual(response.context['foo1'], 'bar1')
589-
self.assertEqual(response.context['foo2'], 'bar2')
590-
self.assertEqual(response.context['key'], 'value')
591-
self.assertIsInstance(response.context['view'], View)
592-
593-
def test_template_params_warning(self):
594-
response = self.client.get('/template/custom/bar1/bar2/')
595-
self.assertEqual(response.status_code, 200)
596-
msg = (
597-
'TemplateView passing URL kwargs to the context is deprecated. '
598-
'Reference %s in your template through view.kwargs instead.'
599-
)
600-
with self.assertRaisesMessage(RemovedInDjango40Warning, msg % 'foo1'):
601-
str(response.context['foo1'])
602-
with self.assertRaisesMessage(RemovedInDjango40Warning, msg % 'foo2'):
603-
str(response.context['foo2'])
604-
self.assertEqual(response.context['key'], 'value')
605-
self.assertIsInstance(response.context['view'], View)

tests/generic_views/urls.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@
1212
path('template/no_template/', TemplateView.as_view()),
1313
path('template/login_required/', login_required(TemplateView.as_view())),
1414
path('template/simple/<foo>/', TemplateView.as_view(template_name='generic_views/about.html')),
15-
path(
16-
'template/custom/<foo1>/<foo2>/',
17-
views.CustomTemplateView.as_view(template_name='generic_views/about.html'),
18-
),
15+
path('template/custom/<foo>/', views.CustomTemplateView.as_view(template_name='generic_views/about.html')),
1916
path(
2017
'template/content_type/',
2118
TemplateView.as_view(template_name='generic_views/robots.txt', content_type='text/plain'),

0 commit comments

Comments
 (0)