[1.11.x] Fixed #26028 -- Added overriding templates howto.

Backport of 7c9a833301 from master
This commit is contained in:
Philip James 2016-06-04 11:50:45 -07:00 committed by Tim Graham
parent fa63fc91cc
commit 34ea3d61af
3 changed files with 98 additions and 0 deletions

View File

@ -24,6 +24,7 @@ you quickly accomplish common tasks.
legacy-databases
outputting-csv
outputting-pdf
overriding-templates
static-files/index
static-files/deployment
windows

View File

@ -0,0 +1,94 @@
====================
Overriding templates
====================
In your project, you might want to override a template in another Django
application, whether it be a third-party application or a contrib application
such as ``django.contrib.admin``. You can either put template overrides in your
project's templates directory or in an application's templates directory.
If you have app and project templates directories that both contain overrides,
the default Django template loader will try to load the template from the
project-level directory first. In other words, :setting:`DIRS <TEMPLATES-DIRS>`
is searched before :setting:`APP_DIRS <TEMPLATES-APP_DIRS>`.
Overriding from the project's templates directory
=================================================
First, we'll explore overriding templates by creating replacement templates in
your project's templates directory.
Let's say you're trying to override the templates for a third-party application
called ``blog``, which provides the templates ``blog/post.html`` and
``blog/list.html``. The relevant settings for your project would look like::
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
INSTALLED_APPS = [
...,
'blog',
...,
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
...
},
]
The :setting:`TEMPLATES` setting and ``BASE_DIR`` will already exist if you
created your project using the default project template. The setting that needs
to be modified is :setting:`DIRS<TEMPLATES-DIRS>`.
These settings assume you have a ``templates`` directory in the root of your
project. To override the templates for the ``blog`` app, create a folder
in the ``templates`` directory, and add the template files to that folder:
.. code-block:: none
templates/
blog/
list.html
post.html
The template loader first looks for templates in the ``DIRS`` directory. When
the views in the ``blog`` app ask for the ``blog/post.html`` and
``blog/list.html`` templates, the loader will return the files you just created.
Overriding from an app's template directory
===========================================
Since you're overriding templates located outside of one of your project's
apps, it's more common to use the first method and put template overrides in a
project's templates folder. If you prefer, however, it's also possible to put
the overrides in an app's template directory.
First, make sure your template settings are checking inside app directories::
TEMPLATES = [
{
...,
'APP_DIRS': True,
...
},
]
If you want to put the template overrides in an app called ``myapp`` and the
templates to override are named ``blog/list.html`` and ``blog/post.html``,
then your directory structure will look like:
.. code-block:: none
myapp/
templates/
blog/
list.html
post.html
With :setting:`APP_DIRS<TEMPLATES-APP_DIRS>` set to ``True``, the template
loader will look in the app's templates directory and find the templates.

View File

@ -20,3 +20,6 @@ material, see :doc:`/topics/templates` topic guide.
For information on writing your own custom tags and filters, see
:doc:`/howto/custom-template-tags`.
To learn how to override templates in other Django applications, see
:doc:`/howto/overriding-templates`.