diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 366577519..faeac5024 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -8,11 +8,11 @@ from functools import reduce from django.core.exceptions import ImproperlyConfigured from django.db import models from django.db.models.constants import LOOKUP_SEP -from django.template import loader from django.utils.encoding import force_str from django.utils.translation import gettext_lazy as _ from rest_framework.compat import coreapi, coreschema, distinct +from rest_framework.renderers import loader from rest_framework.settings import api_settings diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index a73f2e526..e8e47ad63 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -8,12 +8,12 @@ from urllib import parse from django.core.paginator import InvalidPage from django.core.paginator import Paginator as DjangoPaginator -from django.template import loader from django.utils.encoding import force_str from django.utils.translation import gettext_lazy as _ from rest_framework.compat import coreapi, coreschema from rest_framework.exceptions import NotFound +from rest_framework.renderers import loader from rest_framework.response import Response from rest_framework.settings import api_settings from rest_framework.utils.urls import remove_query_param, replace_query_param diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index a96fa6e65..3dab9026b 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -15,7 +15,7 @@ from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.core.paginator import Page from django.http.multipartparser import parse_header -from django.template import engines, loader +from django.template import engines, loader as django_template_loader from django.urls import NoReverseMatch from django.utils.html import mark_safe @@ -35,6 +35,23 @@ from rest_framework.utils.field_mapping import ClassLookupDict def zero_as_none(value): return None if value == 0 else value +class TemplateEngineLoader(object): + """ + In case a project uses multiple template engines + this class enhances the used `loader.get_template` + and `loader.select_template` by specifying the `NAME` + for the used template engine. + See also: https://docs.djangoproject.com/en/3.0/topics/templates/#configuration + """ + def __init__(self): + self.engine_name = api_settings.DEFAULT_TEMPLATE_ENGINE + def get_template(self, template_name): + return django_template_loader.get_template(template_name, using=self.engine_name) + def select_template(self, template_name_list, using=None): + return django_template_loader.select_template(template_name_list, using=self.engine_name) + +loader = TemplateEngineLoader() + class BaseRenderer: """ diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 9eb4c5653..1378a3752 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -61,6 +61,9 @@ DEFAULTS = { }, 'NUM_PROXIES': None, + # Custom template engine NAME + 'DEFAULT_TEMPLATE_ENGINE': None + # Pagination 'PAGE_SIZE': None, diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py index 79dd953ff..76e0c23fd 100644 --- a/rest_framework/templatetags/rest_framework.py +++ b/rest_framework/templatetags/rest_framework.py @@ -2,14 +2,13 @@ import re from collections import OrderedDict from django import template -from django.template import loader from django.urls import NoReverseMatch, reverse from django.utils.encoding import force_str, iri_to_uri from django.utils.html import escape, format_html, smart_urlquote from django.utils.safestring import SafeData, mark_safe from rest_framework.compat import apply_markdown, pygments_highlight -from rest_framework.renderers import HTMLFormRenderer +from rest_framework.renderers import HTMLFormRenderer, loader from rest_framework.utils.urls import replace_query_param register = template.Library() diff --git a/tests/test_renderers.py b/tests/test_renderers.py index 71c5fb3f6..af25ad21a 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -7,7 +7,6 @@ from django.conf.urls import include, url from django.core.cache import cache from django.db import models from django.http.request import HttpRequest -from django.template import loader from django.test import TestCase, override_settings from django.utils.safestring import SafeText from django.utils.translation import gettext_lazy as _ @@ -17,7 +16,8 @@ from rest_framework.compat import coreapi from rest_framework.decorators import action from rest_framework.renderers import ( AdminRenderer, BaseRenderer, BrowsableAPIRenderer, DocumentationRenderer, - HTMLFormRenderer, JSONRenderer, SchemaJSRenderer, StaticHTMLRenderer + HTMLFormRenderer, JSONRenderer, SchemaJSRenderer, StaticHTMLRenderer, + loader ) from rest_framework.request import Request from rest_framework.response import Response