Deprecated dirs argument to override TEMPLATE_DIRS.

Cancels 2f0566fa. Refs #4278.
This commit is contained in:
Aymeric Augustin 2014-11-13 20:25:08 +01:00
parent bcb693ebd4
commit 17012b6936
6 changed files with 68 additions and 36 deletions

View File

@ -6,6 +6,9 @@ from django.template.loaders.utils import get_template_loaders
from django.utils.deprecation import RemovedInDjango20Warning from django.utils.deprecation import RemovedInDjango20Warning
_dirs_undefined = object()
class LoaderOrigin(Origin): class LoaderOrigin(Origin):
def __init__(self, display_name, loader, name, dirs): def __init__(self, display_name, loader, name, dirs):
super(LoaderOrigin, self).__init__(display_name) super(LoaderOrigin, self).__init__(display_name)
@ -32,11 +35,18 @@ def find_template(name, dirs=None):
raise TemplateDoesNotExist(name) raise TemplateDoesNotExist(name)
def get_template(template_name, dirs=None): def get_template(template_name, dirs=_dirs_undefined):
""" """
Returns a compiled Template object for the given template name, Returns a compiled Template object for the given template name,
handling template inheritance recursively. handling template inheritance recursively.
""" """
if dirs is _dirs_undefined:
dirs = None
else:
warnings.warn(
"The dirs argument of get_template is deprecated.",
RemovedInDjango20Warning, stacklevel=2)
template, origin = find_template(template_name, dirs) template, origin = find_template(template_name, dirs)
if not hasattr(template, 'render'): if not hasattr(template, 'render'):
# template needs to be compiled # template needs to be compiled
@ -53,13 +63,22 @@ def get_template_from_string(source, origin=None, name=None):
def render_to_string(template_name, dictionary=None, context_instance=None, def render_to_string(template_name, dictionary=None, context_instance=None,
dirs=None): dirs=_dirs_undefined):
""" """
Loads the given template_name and renders it with the given dictionary as Loads the given template_name and renders it with the given dictionary as
context. The template_name may be a string to load a single template using context. The template_name may be a string to load a single template using
get_template, or it may be a tuple to use select_template to find one of get_template, or it may be a tuple to use select_template to find one of
the templates in the list. Returns a string. the templates in the list. Returns a string.
""" """
if dirs is _dirs_undefined:
# Do not set dirs to None here to avoid triggering the deprecation
# warning in select_template or get_template.
pass
else:
warnings.warn(
"The dirs argument of render_to_string is deprecated.",
RemovedInDjango20Warning, stacklevel=2)
if isinstance(template_name, (list, tuple)): if isinstance(template_name, (list, tuple)):
t = select_template(template_name, dirs) t = select_template(template_name, dirs)
else: else:
@ -79,8 +98,17 @@ def render_to_string(template_name, dictionary=None, context_instance=None,
return t.render(context_instance) return t.render(context_instance)
def select_template(template_name_list, dirs=None): def select_template(template_name_list, dirs=_dirs_undefined):
"Given a list of template names, returns the first that can be loaded." "Given a list of template names, returns the first that can be loaded."
if dirs is _dirs_undefined:
# Do not set dirs to None here to avoid triggering the deprecation
# warning in get_template.
pass
else:
warnings.warn(
"The dirs argument of select_template is deprecated.",
RemovedInDjango20Warning, stacklevel=2)
if not template_name_list: if not template_name_list:
raise TemplateDoesNotExist("No template names provided") raise TemplateDoesNotExist("No template names provided")
not_found = [] not_found = []

View File

@ -659,25 +659,27 @@ The Python API
the template with the given name. If the template doesn't exist, it raises the template with the given name. If the template doesn't exist, it raises
``django.template.TemplateDoesNotExist``. ``django.template.TemplateDoesNotExist``.
To override the :setting:`TEMPLATE_DIRS` setting, use the ``dirs``
parameter. The ``dirs`` parameter may be a tuple or list.
.. versionchanged:: 1.7 .. versionchanged:: 1.7
The ``dirs`` parameter was added. The ``dirs`` parameter was added.
.. versionchanged:: 1.8
The ``dirs`` parameter was deprecated.
.. function:: select_template(template_name_list[, dirs]) .. function:: select_template(template_name_list[, dirs])
``select_template`` is just like ``get_template``, except it takes a list ``select_template`` is just like ``get_template``, except it takes a list
of template names. Of the list, it returns the first template that exists. of template names. Of the list, it returns the first template that exists.
To override the :setting:`TEMPLATE_DIRS` setting, use the ``dirs``
parameter. The ``dirs`` parameter may be a tuple or list.
.. versionchanged:: 1.7 .. versionchanged:: 1.7
The ``dirs`` parameter was added. The ``dirs`` parameter was added.
.. versionchanged:: 1.8
The ``dirs`` parameter was deprecated.
For example, if you call ``get_template('story_detail.html')`` and have the For example, if you call ``get_template('story_detail.html')`` and have the
above :setting:`TEMPLATE_DIRS` setting, here are the files Django will look for, above :setting:`TEMPLATE_DIRS` setting, here are the files Django will look for,
in order: in order:

View File

@ -1053,6 +1053,17 @@ The decorators :func:`~django.test.override_settings` and
class decorators. As a consequence, when overriding ``setUpClass()`` or class decorators. As a consequence, when overriding ``setUpClass()`` or
``tearDownClass()``, the ``super`` implementation should always be called. ``tearDownClass()``, the ``super`` implementation should always be called.
``dirs`` argument of template-finding functions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The following functions no longer accept a ``dirs`` parameter to override
:setting:`TEMPLATE_DIRS`:
* :func:`django.template.loader.get_template()`
* :func:`django.template.loader.select_template()`
* :func:`django.shortcuts.render()`
* :func:`django.shortcuts.render_to_response()`
``django.template.loader.BaseLoader`` ``django.template.loader.BaseLoader``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -63,13 +63,14 @@ Optional arguments
:ref:`namespaced URL resolution strategy <topics-http-reversing-url-namespaces>` :ref:`namespaced URL resolution strategy <topics-http-reversing-url-namespaces>`
for more information. for more information.
``dirs``
A tuple or list of values to override the :setting:`TEMPLATE_DIRS` setting.
.. versionchanged:: 1.7 .. versionchanged:: 1.7
The ``dirs`` parameter was added. The ``dirs`` parameter was added.
.. versionchanged:: 1.8
The ``dirs`` parameter was deprecated.
Example Example
------- -------
@ -95,15 +96,6 @@ This example is equivalent to::
return HttpResponse(t.render(c), return HttpResponse(t.render(c),
content_type="application/xhtml+xml") content_type="application/xhtml+xml")
If you want to override the :setting:`TEMPLATE_DIRS` setting, use the
``dirs`` parameter::
from django.shortcuts import render
def my_view(request):
# View code here...
return render(request, 'index.html', dirs=('custom_templates',))
``render_to_response`` ``render_to_response``
====================== ======================
@ -145,13 +137,14 @@ Optional arguments
The MIME type to use for the resulting document. Defaults to the value of The MIME type to use for the resulting document. Defaults to the value of
the :setting:`DEFAULT_CONTENT_TYPE` setting. the :setting:`DEFAULT_CONTENT_TYPE` setting.
``dirs``
A tuple or list of values to override the :setting:`TEMPLATE_DIRS` setting.
.. versionchanged:: 1.7 .. versionchanged:: 1.7
The ``dirs`` parameter was added. The ``dirs`` parameter was added.
.. versionchanged:: 1.8
The ``dirs`` parameter was deprecated.
Example Example
------- -------
@ -177,15 +170,6 @@ This example is equivalent to::
return HttpResponse(t.render(c), return HttpResponse(t.render(c),
content_type="application/xhtml+xml") content_type="application/xhtml+xml")
If you want to override the :setting:`TEMPLATE_DIRS` setting, use the
``dirs`` parameter::
from django.shortcuts import render_to_response
def my_view(request):
# View code here...
return render_to_response('index.html', dirs=('custom_templates',))
``redirect`` ``redirect``
============ ============

View File

@ -1,3 +1,5 @@
import warnings
from django.utils.deprecation import RemovedInDjango20Warning
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
@ -27,7 +29,9 @@ class ShortcutTests(TestCase):
self.assertEqual(response['Content-Type'], 'application/x-rendertest') self.assertEqual(response['Content-Type'], 'application/x-rendertest')
def test_render_to_response_with_dirs(self): def test_render_to_response_with_dirs(self):
response = self.client.get('/render_to_response/dirs/') with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=RemovedInDjango20Warning)
response = self.client.get('/render_to_response/dirs/')
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.content, b'spam eggs\n') self.assertEqual(response.content, b'spam eggs\n')
self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8')
@ -70,7 +74,9 @@ class ShortcutTests(TestCase):
self.assertEqual(response.context.current_app, "foobar_app") self.assertEqual(response.context.current_app, "foobar_app")
def test_render_with_dirs(self): def test_render_with_dirs(self):
response = self.client.get('/render/dirs/') with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=RemovedInDjango20Warning)
response = self.client.get('/render/dirs/')
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.content, b'spam eggs\n') self.assertEqual(response.content, b'spam eggs\n')
self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8')

View File

@ -25,6 +25,7 @@ from django.template.loaders.eggs import Loader as EggLoader
from django.template.loaders.utils import find_template_loader from django.template.loaders.utils import find_template_loader
from django.template import loader from django.template import loader
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from django.test.utils import IgnorePendingDeprecationWarningsMixin
from django.utils import six from django.utils import six
from django.utils._os import upath from django.utils._os import upath
from django.utils.six import StringIO from django.utils.six import StringIO
@ -185,7 +186,7 @@ class RenderToStringTest(TestCase):
loader.render_to_string('test_context_stack.html', context_instance=Context()).strip()) loader.render_to_string('test_context_stack.html', context_instance=Context()).strip())
class TemplateDirsOverrideTest(unittest.TestCase): class TemplateDirsOverrideTest(IgnorePendingDeprecationWarningsMixin, unittest.TestCase):
dirs_tuple = (os.path.join(os.path.dirname(upath(__file__)), 'other_templates'),) dirs_tuple = (os.path.join(os.path.dirname(upath(__file__)), 'other_templates'),)
dirs_list = list(dirs_tuple) dirs_list = list(dirs_tuple)