52
From the Django book, chapter 4:
If you can’t think of an obvious place
to put your templates, we recommend
creating a templates directory within
your Django project (i.e., within the
mysite directory you created in
Chapter 2, if you’ve been following
along with our examples).
This is exactly what I do, and has worked great for me.
My directory structure looks something like this:
/media
for all my CSS/JS/images etc
/templates
for my templates
/projectname
for the main project code (i.e. the Python code)
99
Placed in <PROJECT>/<APP>/templates/<APP>/template.html
for app-specific templates to help with making the app reusable elsewhere.
For general “global” templates I put them in <PROJECT>/templates/template.html
- [Django]-How to spread django unit tests over multiple files?
- [Django]-Logging in Django and gunicorn
- [Django]-Django values_list vs values
10
DJANGO 1.11
add templates folder where the manage.py exist,which is your base directory.
change the DIRS for TEMPLATES as following in your settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Now to use the template by using the code ,
def home(request):
return render(request,"index.html",{})
in views.py.
this works completely fine for django 1.11
- [Django]-Function decorators with parameters on a class based view in Django
- [Django]-Django Form File Field disappears on form error
- [Django]-Django content-type : how do I get an object?
9
Following up from Dominic and dlrust,
We use a setuptools source distribution (sdist) to package our django project and apps to deploy in our different environments.
We have found that the templates and static files need to be under the django application directories so that they can be packaged up by setuptools.
For example, our template and static paths look like:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
For this to work, the MANIFEST.in needs to be modified (see http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template)
An example of the MANIFEST.in:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
Also, you need to confirm in your django settings file that the app_directories loader is in your TEMPLATE_LOADERS. I think it’s there by default in django 1.4.
An example of the django settings template loaders:
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
Just in case you are wondering why we use sdists instead of just coping rsync files; it’s part of our configuration management workflow where we have a single build tarball that is deployed with PIP unchanged into test, acceptance and production environments.
- [Django]-Manager isn't accessible via model instances
- [Django]-Django south migration – Adding FULLTEXT indexes
- [Django]-How to access array elements in a Django template?
3
Django 1.10
TEMPLATE_DIRS
is deprecated.
Now we need to use TEMPLATE
, introducing in Django 1.8 like this:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
Once you have defined TEMPLATES, you can safely remove ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS, and TEMPLATE_STRING_IF_INVALID.
About the best location, Django looking for template like this :
- DIRS defines a list of directories where the engine should look for template source files, in search order.
- APP_DIRS tells whether the engine should look for templates inside installed applications. Each backend defines a conventional name for the subdirectory inside applications where its templates should be stored.
More information :
https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
- [Django]-Django 1.5b1: executing django-admin.py causes "No module named settings" error
- [Django]-Macros in django templates
- [Django]-Modulus % in Django template
1
This is more a personal choice at the project-level. If you are talking about apps that need to be pluggable, then a templates directory in your app is the place where they go default. But project-wide, it is what works best for you.
- [Django]-Allowing only super user login
- [Django]-How to unit test file upload in django
- [Django]-Are Django SECRET_KEY's per instance or per app?
1
I understood TEMPLATE_DIRS
requires an absolute path. And I don’t like absolute paths in my code.
So this is working well for me, in settings.py
:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
- [Django]-Multiple Models in a single django ModelForm?
- [Django]-How to add superuser in Django from fixture
- [Django]-Django – "no module named django.core.management"
0
You could also consider having your templates in a database, using django-dbtemplates. It is also setup for caching, and the django-reversion application which helps you keep old versions of your templates around.
It works quite well, but I’d prefer a little more flexibility on the import/sync to/from filesystem side.
[edit: 20 Aug 2018 – this repository is no available, one with the same name is available at https://github.com/jazzband/django-dbtemplates and was updated 8 months ago. I no longer use Django in any meaningful way, so can’t vouch for this.]
- [Django]-Using Pylint with Django
- [Django]-Django removing object from ManyToMany relationship
- [Django]-How to view corresponding SQL query of the Django ORM's queryset?
0
Previous solution didn’t work in my case. I used:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
- [Django]-Django 2.0 – Not a valid view function or pattern name (Customizing Auth views)
- [Django]-Django Passing Custom Form Parameters to Formset
- [Django]-How to make two django projects share the same database
0
templates
folder just under django-project
is the best location as shown below because we can more easily manage templates in one place than templates
folder just under each app folder. You can see my answer explaining how to set templates
folder in detail:
django-project
|-core
│ |-settings.py
│ └-urls.py
|-app1
| |-urls.py
| â””-views.py
|-app2
| |-urls.py
| â””-views.py
â””-templates # Here
|-app1
| â””-a1.html
â””-app2
â””-a2.html
Then, so that templates
folder just under django-project
can be found, you need to set BASE_DIR / 'templates'
to "DIRS" in TEMPLATES in settings.py
as shown below:
# "settings.py"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
BASE_DIR / 'templates', # Here
],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
- [Django]-How to run own daemon processes with Django?
- [Django]-Explicitly set MySQL table storage engine using South and Django
- [Django]-Choose test database?