Deprecated dirs argument to override TEMPLATE_DIRS.
Cancels 2f0566fa
. Refs #4278.
This commit is contained in:
parent
bcb693ebd4
commit
17012b6936
|
@ -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 = []
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -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``
|
||||||
============
|
============
|
||||||
|
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue