Fix template.render deprecation warnings for 1.9+

This commit is contained in:
Andrei Fokau 2015-11-18 15:25:58 +01:00
parent 04158e187e
commit 802ee5d0ea
5 changed files with 62 additions and 38 deletions

View File

@ -9,6 +9,7 @@ from __future__ import unicode_literals
import django import django
from django.conf import settings from django.conf import settings
from django.db import connection, transaction from django.db import connection, transaction
from django.template import Context, RequestContext, Template
from django.utils import six from django.utils import six
from django.views.generic import View from django.views.generic import View
@ -191,6 +192,7 @@ try:
except ImportError: except ImportError:
DecimalValidator = None DecimalValidator = None
def set_rollback(): def set_rollback():
if hasattr(transaction, 'set_rollback'): if hasattr(transaction, 'set_rollback'):
if connection.settings_dict.get('ATOMIC_REQUESTS', False): if connection.settings_dict.get('ATOMIC_REQUESTS', False):
@ -206,3 +208,25 @@ def set_rollback():
else: else:
# transaction not managed # transaction not managed
pass pass
def template_render(template, context=None, request=None):
"""
Passing Context or RequestContext to Template.render is deprecated in 1.9+,
see https://github.com/django/django/pull/3883 and
https://github.com/django/django/blob/1.9rc1/django/template/backends/django.py#L82-L84
:param template: Template instance
:param context: dict
:param request: Request instance
:return: rendered template as SafeText instance
"""
if django.VERSION < (1, 9) or isinstance(template, Template):
if request:
context = RequestContext(request, context)
else:
context = Context(context)
return template.render(context)
# backends template, e.g. django.template.backends.django.Template
else:
return template.render(context, request=request)

View File

@ -10,12 +10,12 @@ from functools import reduce
from django.conf import settings from django.conf import settings
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.db import models from django.db import models
from django.template import Context, loader from django.template import loader
from django.utils import six from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import ( from rest_framework.compat import (
crispy_forms, distinct, django_filters, guardian crispy_forms, distinct, django_filters, guardian, template_render
) )
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
@ -122,11 +122,11 @@ class DjangoFilterBackend(BaseFilterBackend):
filter_instance = filter_class(request.query_params, queryset=queryset) filter_instance = filter_class(request.query_params, queryset=queryset)
else: else:
filter_instance = None filter_instance = None
context = Context({ context = {
'filter': filter_instance 'filter': filter_instance
}) }
template = loader.get_template(self.template) template = loader.get_template(self.template)
return template.render(context) return template_render(template, context)
class SearchFilter(BaseFilterBackend): class SearchFilter(BaseFilterBackend):
@ -185,12 +185,12 @@ class SearchFilter(BaseFilterBackend):
term = self.get_search_terms(request) term = self.get_search_terms(request)
term = term[0] if term else '' term = term[0] if term else ''
context = Context({ context = {
'param': self.search_param, 'param': self.search_param,
'term': term 'term': term
}) }
template = loader.get_template(self.template) template = loader.get_template(self.template)
return template.render(context) return template_render(template, context)
class OrderingFilter(BaseFilterBackend): class OrderingFilter(BaseFilterBackend):
@ -284,8 +284,8 @@ class OrderingFilter(BaseFilterBackend):
def to_html(self, request, queryset, view): def to_html(self, request, queryset, view):
template = loader.get_template(self.template) template = loader.get_template(self.template)
context = Context(self.get_template_context(request, queryset, view)) context = self.get_template_context(request, queryset, view)
return template.render(context) return template_render(template, context)
class DjangoObjectPermissionsFilter(BaseFilterBackend): class DjangoObjectPermissionsFilter(BaseFilterBackend):

View File

@ -10,11 +10,12 @@ from collections import OrderedDict, namedtuple
from django.core.paginator import Paginator as DjangoPaginator from django.core.paginator import Paginator as DjangoPaginator
from django.core.paginator import InvalidPage from django.core.paginator import InvalidPage
from django.template import Context, loader from django.template import loader
from django.utils import six from django.utils import six
from django.utils.six.moves.urllib import parse as urlparse from django.utils.six.moves.urllib import parse as urlparse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import template_render
from rest_framework.exceptions import NotFound from rest_framework.exceptions import NotFound
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
@ -273,8 +274,8 @@ class PageNumberPagination(BasePagination):
def to_html(self): def to_html(self):
template = loader.get_template(self.template) template = loader.get_template(self.template)
context = Context(self.get_html_context()) context = self.get_html_context()
return template.render(context) return template_render(template, context)
class LimitOffsetPagination(BasePagination): class LimitOffsetPagination(BasePagination):
@ -389,8 +390,8 @@ class LimitOffsetPagination(BasePagination):
def to_html(self): def to_html(self):
template = loader.get_template(self.template) template = loader.get_template(self.template)
context = Context(self.get_html_context()) context = self.get_html_context()
return template.render(context) return template_render(template, context)
class CursorPagination(BasePagination): class CursorPagination(BasePagination):
@ -692,5 +693,5 @@ class CursorPagination(BasePagination):
def to_html(self): def to_html(self):
template = loader.get_template(self.template) template = loader.get_template(self.template)
context = Context(self.get_html_context()) context = self.get_html_context()
return template.render(context) return template_render(template, context)

View File

@ -15,13 +15,13 @@ from django import forms
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.paginator import Page from django.core.paginator import Page
from django.http.multipartparser import parse_header from django.http.multipartparser import parse_header
from django.template import Context, RequestContext, Template, loader from django.template import Template, loader
from django.test.client import encode_multipart from django.test.client import encode_multipart
from django.utils import six from django.utils import six
from rest_framework import VERSION, exceptions, serializers, status from rest_framework import VERSION, exceptions, serializers, status
from rest_framework.compat import ( from rest_framework.compat import (
INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, template_render
) )
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from rest_framework.request import is_form_media_type, override_method from rest_framework.request import is_form_media_type, override_method
@ -168,7 +168,7 @@ class TemplateHTMLRenderer(BaseRenderer):
template = self.resolve_template(template_names) template = self.resolve_template(template_names)
context = self.resolve_context(data, request, response) context = self.resolve_context(data, request, response)
return template.render(context) return template_render(template, context, request=request)
def resolve_template(self, template_names): def resolve_template(self, template_names):
return loader.select_template(template_names) return loader.select_template(template_names)
@ -176,7 +176,7 @@ class TemplateHTMLRenderer(BaseRenderer):
def resolve_context(self, data, request, response): def resolve_context(self, data, request, response):
if response.exception: if response.exception:
data['status_code'] = response.status_code data['status_code'] = response.status_code
return RequestContext(request, data) return data
def get_template_names(self, response, view): def get_template_names(self, response, view):
if response.template_name: if response.template_name:
@ -230,7 +230,7 @@ class StaticHTMLRenderer(TemplateHTMLRenderer):
request = renderer_context['request'] request = renderer_context['request']
template = self.get_exception_template(response) template = self.get_exception_template(response)
context = self.resolve_context(data, request, response) context = self.resolve_context(data, request, response)
return template.render(context) return template_render(template, context, request=request)
return data return data
@ -333,8 +333,8 @@ class HTMLFormRenderer(BaseRenderer):
template_name = style['template_pack'].strip('/') + '/' + style['base_template'] template_name = style['template_pack'].strip('/') + '/' + style['base_template']
template = loader.get_template(template_name) template = loader.get_template(template_name)
context = Context({'field': field, 'style': style}) context = {'field': field, 'style': style}
return template.render(context) return template_render(template, context)
def render(self, data, accepted_media_type=None, renderer_context=None): def render(self, data, accepted_media_type=None, renderer_context=None):
""" """
@ -350,11 +350,11 @@ class HTMLFormRenderer(BaseRenderer):
template_pack = style['template_pack'].strip('/') template_pack = style['template_pack'].strip('/')
template_name = template_pack + '/' + self.base_template template_name = template_pack + '/' + self.base_template
template = loader.get_template(template_name) template = loader.get_template(template_name)
context = Context({ context = {
'form': form, 'form': form,
'style': style 'style': style
}) }
return template.render(context) return template_render(template, context)
class BrowsableAPIRenderer(BaseRenderer): class BrowsableAPIRenderer(BaseRenderer):
@ -600,8 +600,8 @@ class BrowsableAPIRenderer(BaseRenderer):
return return
template = loader.get_template(self.filter_template) template = loader.get_template(self.filter_template)
context = Context({'elements': elements}) context = {'elements': elements}
return template.render(context) return template_render(template, context)
def get_context(self, data, accepted_media_type, renderer_context): def get_context(self, data, accepted_media_type, renderer_context):
""" """
@ -672,8 +672,7 @@ class BrowsableAPIRenderer(BaseRenderer):
template = loader.get_template(self.template) template = loader.get_template(self.template)
context = self.get_context(data, accepted_media_type, renderer_context) context = self.get_context(data, accepted_media_type, renderer_context)
context = RequestContext(renderer_context['request'], context) ret = template_render(template, context, request=renderer_context['request'])
ret = template.render(context)
# Munge DELETE Response code to allow us to return content # Munge DELETE Response code to allow us to return content
# (Do this *after* we've rendered the template so that we include # (Do this *after* we've rendered the template so that we include
@ -709,8 +708,7 @@ class AdminRenderer(BrowsableAPIRenderer):
template = loader.get_template(self.template) template = loader.get_template(self.template)
context = self.get_context(data, accepted_media_type, renderer_context) context = self.get_context(data, accepted_media_type, renderer_context)
context = RequestContext(renderer_context['request'], context) ret = template_render(template, context, request=renderer_context['request'])
ret = template.render(context)
# Creation and deletion should use redirects in the admin style. # Creation and deletion should use redirects in the admin style.
if (response.status_code == status.HTTP_201_CREATED) and ('Location' in response): if (response.status_code == status.HTTP_201_CREATED) and ('Location' in response):

View File

@ -4,12 +4,13 @@ import re
from django import template from django import template
from django.core.urlresolvers import NoReverseMatch, reverse from django.core.urlresolvers import NoReverseMatch, reverse
from django.template import Context, loader from django.template import loader
from django.utils import six from django.utils import six
from django.utils.encoding import force_text, iri_to_uri from django.utils.encoding import force_text, iri_to_uri
from django.utils.html import escape, format_html, smart_urlquote from django.utils.html import escape, format_html, smart_urlquote
from django.utils.safestring import SafeData, mark_safe from django.utils.safestring import SafeData, mark_safe
from rest_framework.compat import template_render
from rest_framework.renderers import HTMLFormRenderer from rest_framework.renderers import HTMLFormRenderer
from rest_framework.utils.urls import replace_query_param from rest_framework.utils.urls import replace_query_param
@ -128,12 +129,12 @@ def format_value(value):
template = loader.get_template('rest_framework/admin/list_value.html') template = loader.get_template('rest_framework/admin/list_value.html')
else: else:
template = loader.get_template('rest_framework/admin/simple_list_value.html') template = loader.get_template('rest_framework/admin/simple_list_value.html')
context = Context({'value': value}) context = {'value': value}
return template.render(context) return template_render(template, context)
elif isinstance(value, dict): elif isinstance(value, dict):
template = loader.get_template('rest_framework/admin/dict_value.html') template = loader.get_template('rest_framework/admin/dict_value.html')
context = Context({'value': value}) context = {'value': value}
return template.render(context) return template_render(template, context)
elif isinstance(value, six.string_types): elif isinstance(value, six.string_types):
if ( if (
(value.startswith('http:') or value.startswith('https:')) and not (value.startswith('http:') or value.startswith('https:')) and not