Django project base template
Can I create a base template for my project which all apps can draw from? Or do I have to create a base template for each app? And if I wanted them to be the same I'd just copy them?
Solution 1:
Sure you can. A quick example of a base.html
<!DOCTYPE html>
<html>
<head>
<title>My Project</title>
</head>
<body>
{% block content %}{% endblock content %}
</body>
</html>
And say you have a app called myapp with a view.html page,
{% extends "base.html" %}
{% block content %}
<h2>Content for My App</h2>
<p>Stuff etc etc.</p>
{% endblock content %}
Take some time to read the docs for more information
Solution 2:
For Django version 3
Some of the answers here are correct, but they do not tell you where to place the files in the directory structure. So I am going to explain the answer a bit.
Yes, you can use {% extends "base.html" %}
to extend the base.html
file from your project directory.
Important thing to note is where to place the base.html
file.
- open
project_name/project_name/settings.py
and find theTEMPLATES
array
and update the'DIRS' : []
to'DIRS': [os.path.join(BASE_DIR, 'templates')]
- Create a directory at root level named
templates
. The location of this folder will beproject_name/templates
- Place all templates here in
projects_name/templates
that you want to access from all the apps.
File:project_name/templates/base.html
-
Extend this base file from any application-specific template, that might be located at
project_name/app_name/templates/app_name/template_file.html
by using{% extends "base.html" %}
.{% extends "base.html" %} {% block content %} <h2>Content for My App</h2> <p>Stuff etc etc.</p> {% endblock content %}
Additionally, you can also create project-wide static
directory at the same level as template directory by updating STATICFILES_DIRS
to STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
in project_name/project_name/settings.py
.
Final Directory Structure looks like -
project_name/
app_name/
templates/
app_name/
template_file.html
project_name/
settings.py
templates/
base.html
static/
css/
js/
img/
Solution 3:
There is some problem in last answer and here is the correct one; you must have Base.html like this:
{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
<title>My Project</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
and also for index.html
{% extends "appname/base.html" %}
{% block content %}
<h1>test</h1>
{% endblock %}
Solution 4:
Yes you can absolutely do that. By using extends
and include
template tags in your Django templates.
I am starting to learn Django and recently figured this out. My code is at Github if you are interested in taking a look at how I structure Django templates to inherit from a base.html
and then include
common stuff such as navbar and header, footer etc.