Skip to content

Commit 802ee5d

Browse files
committed
Fix template.render deprecation warnings for 1.9+
1 parent 04158e1 commit 802ee5d

File tree

5 files changed

+62
-38
lines changed

5 files changed

+62
-38
lines changed

rest_framework/compat.py

+24
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import django
1010
from django.conf import settings
1111
from django.db import connection, transaction
12+
from django.template import Context, RequestContext, Template
1213
from django.utils import six
1314
from django.views.generic import View
1415

@@ -191,6 +192,7 @@ def apply_markdown(text):
191192
except ImportError:
192193
DecimalValidator = None
193194

195+
194196
def set_rollback():
195197
if hasattr(transaction, 'set_rollback'):
196198
if connection.settings_dict.get('ATOMIC_REQUESTS', False):
@@ -206,3 +208,25 @@ def set_rollback():
206208
else:
207209
# transaction not managed
208210
pass
211+
212+
213+
def template_render(template, context=None, request=None):
214+
"""
215+
Passing Context or RequestContext to Template.render is deprecated in 1.9+,
216+
see https://github.com/django/django/pull/3883 and
217+
https://github.com/django/django/blob/1.9rc1/django/template/backends/django.py#L82-L84
218+
219+
:param template: Template instance
220+
:param context: dict
221+
:param request: Request instance
222+
:return: rendered template as SafeText instance
223+
"""
224+
if django.VERSION < (1, 9) or isinstance(template, Template):
225+
if request:
226+
context = RequestContext(request, context)
227+
else:
228+
context = Context(context)
229+
return template.render(context)
230+
# backends template, e.g. django.template.backends.django.Template
231+
else:
232+
return template.render(context, request=request)

rest_framework/filters.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
from django.conf import settings
1111
from django.core.exceptions import ImproperlyConfigured
1212
from django.db import models
13-
from django.template import Context, loader
13+
from django.template import loader
1414
from django.utils import six
1515
from django.utils.translation import ugettext_lazy as _
1616

1717
from rest_framework.compat import (
18-
crispy_forms, distinct, django_filters, guardian
18+
crispy_forms, distinct, django_filters, guardian, template_render
1919
)
2020
from rest_framework.settings import api_settings
2121

@@ -122,11 +122,11 @@ def to_html(self, request, queryset, view):
122122
filter_instance = filter_class(request.query_params, queryset=queryset)
123123
else:
124124
filter_instance = None
125-
context = Context({
125+
context = {
126126
'filter': filter_instance
127-
})
127+
}
128128
template = loader.get_template(self.template)
129-
return template.render(context)
129+
return template_render(template, context)
130130

131131

132132
class SearchFilter(BaseFilterBackend):
@@ -185,12 +185,12 @@ def to_html(self, request, queryset, view):
185185

186186
term = self.get_search_terms(request)
187187
term = term[0] if term else ''
188-
context = Context({
188+
context = {
189189
'param': self.search_param,
190190
'term': term
191-
})
191+
}
192192
template = loader.get_template(self.template)
193-
return template.render(context)
193+
return template_render(template, context)
194194

195195

196196
class OrderingFilter(BaseFilterBackend):
@@ -284,8 +284,8 @@ def get_template_context(self, request, queryset, view):
284284

285285
def to_html(self, request, queryset, view):
286286
template = loader.get_template(self.template)
287-
context = Context(self.get_template_context(request, queryset, view))
288-
return template.render(context)
287+
context = self.get_template_context(request, queryset, view)
288+
return template_render(template, context)
289289

290290

291291
class DjangoObjectPermissionsFilter(BaseFilterBackend):

rest_framework/pagination.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@
1010

1111
from django.core.paginator import Paginator as DjangoPaginator
1212
from django.core.paginator import InvalidPage
13-
from django.template import Context, loader
13+
from django.template import loader
1414
from django.utils import six
1515
from django.utils.six.moves.urllib import parse as urlparse
1616
from django.utils.translation import ugettext_lazy as _
1717

18+
from rest_framework.compat import template_render
1819
from rest_framework.exceptions import NotFound
1920
from rest_framework.response import Response
2021
from rest_framework.settings import api_settings
@@ -273,8 +274,8 @@ def page_number_to_url(page_number):
273274

274275
def to_html(self):
275276
template = loader.get_template(self.template)
276-
context = Context(self.get_html_context())
277-
return template.render(context)
277+
context = self.get_html_context()
278+
return template_render(template, context)
278279

279280

280281
class LimitOffsetPagination(BasePagination):
@@ -389,8 +390,8 @@ def page_number_to_url(page_number):
389390

390391
def to_html(self):
391392
template = loader.get_template(self.template)
392-
context = Context(self.get_html_context())
393-
return template.render(context)
393+
context = self.get_html_context()
394+
return template_render(template, context)
394395

395396

396397
class CursorPagination(BasePagination):
@@ -692,5 +693,5 @@ def get_html_context(self):
692693

693694
def to_html(self):
694695
template = loader.get_template(self.template)
695-
context = Context(self.get_html_context())
696-
return template.render(context)
696+
context = self.get_html_context()
697+
return template_render(template, context)

rest_framework/renderers.py

+14-16
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
from django.core.exceptions import ImproperlyConfigured
1616
from django.core.paginator import Page
1717
from django.http.multipartparser import parse_header
18-
from django.template import Context, RequestContext, Template, loader
18+
from django.template import Template, loader
1919
from django.test.client import encode_multipart
2020
from django.utils import six
2121

2222
from rest_framework import VERSION, exceptions, serializers, status
2323
from rest_framework.compat import (
24-
INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS
24+
INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, template_render
2525
)
2626
from rest_framework.exceptions import ParseError
2727
from rest_framework.request import is_form_media_type, override_method
@@ -168,15 +168,15 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
168168
template = self.resolve_template(template_names)
169169

170170
context = self.resolve_context(data, request, response)
171-
return template.render(context)
171+
return template_render(template, context, request=request)
172172

173173
def resolve_template(self, template_names):
174174
return loader.select_template(template_names)
175175

176176
def resolve_context(self, data, request, response):
177177
if response.exception:
178178
data['status_code'] = response.status_code
179-
return RequestContext(request, data)
179+
return data
180180

181181
def get_template_names(self, response, view):
182182
if response.template_name:
@@ -230,7 +230,7 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
230230
request = renderer_context['request']
231231
template = self.get_exception_template(response)
232232
context = self.resolve_context(data, request, response)
233-
return template.render(context)
233+
return template_render(template, context, request=request)
234234

235235
return data
236236

@@ -333,8 +333,8 @@ def render_field(self, field, parent_style):
333333
template_name = style['template_pack'].strip('/') + '/' + style['base_template']
334334

335335
template = loader.get_template(template_name)
336-
context = Context({'field': field, 'style': style})
337-
return template.render(context)
336+
context = {'field': field, 'style': style}
337+
return template_render(template, context)
338338

339339
def render(self, data, accepted_media_type=None, renderer_context=None):
340340
"""
@@ -350,11 +350,11 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
350350
template_pack = style['template_pack'].strip('/')
351351
template_name = template_pack + '/' + self.base_template
352352
template = loader.get_template(template_name)
353-
context = Context({
353+
context = {
354354
'form': form,
355355
'style': style
356-
})
357-
return template.render(context)
356+
}
357+
return template_render(template, context)
358358

359359

360360
class BrowsableAPIRenderer(BaseRenderer):
@@ -600,8 +600,8 @@ def get_filter_form(self, data, view, request):
600600
return
601601

602602
template = loader.get_template(self.filter_template)
603-
context = Context({'elements': elements})
604-
return template.render(context)
603+
context = {'elements': elements}
604+
return template_render(template, context)
605605

606606
def get_context(self, data, accepted_media_type, renderer_context):
607607
"""
@@ -672,8 +672,7 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
672672

673673
template = loader.get_template(self.template)
674674
context = self.get_context(data, accepted_media_type, renderer_context)
675-
context = RequestContext(renderer_context['request'], context)
676-
ret = template.render(context)
675+
ret = template_render(template, context, request=renderer_context['request'])
677676

678677
# Munge DELETE Response code to allow us to return content
679678
# (Do this *after* we've rendered the template so that we include
@@ -709,8 +708,7 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
709708

710709
template = loader.get_template(self.template)
711710
context = self.get_context(data, accepted_media_type, renderer_context)
712-
context = RequestContext(renderer_context['request'], context)
713-
ret = template.render(context)
711+
ret = template_render(template, context, request=renderer_context['request'])
714712

715713
# Creation and deletion should use redirects in the admin style.
716714
if (response.status_code == status.HTTP_201_CREATED) and ('Location' in response):

rest_framework/templatetags/rest_framework.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44

55
from django import template
66
from django.core.urlresolvers import NoReverseMatch, reverse
7-
from django.template import Context, loader
7+
from django.template import loader
88
from django.utils import six
99
from django.utils.encoding import force_text, iri_to_uri
1010
from django.utils.html import escape, format_html, smart_urlquote
1111
from django.utils.safestring import SafeData, mark_safe
1212

13+
from rest_framework.compat import template_render
1314
from rest_framework.renderers import HTMLFormRenderer
1415
from rest_framework.utils.urls import replace_query_param
1516

@@ -128,12 +129,12 @@ def format_value(value):
128129
template = loader.get_template('rest_framework/admin/list_value.html')
129130
else:
130131
template = loader.get_template('rest_framework/admin/simple_list_value.html')
131-
context = Context({'value': value})
132-
return template.render(context)
132+
context = {'value': value}
133+
return template_render(template, context)
133134
elif isinstance(value, dict):
134135
template = loader.get_template('rest_framework/admin/dict_value.html')
135-
context = Context({'value': value})
136-
return template.render(context)
136+
context = {'value': value}
137+
return template_render(template, context)
137138
elif isinstance(value, six.string_types):
138139
if (
139140
(value.startswith('http:') or value.startswith('https:')) and not

0 commit comments

Comments
 (0)