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.

  1. open project_name/project_name/settings.py and find the TEMPLATES array
    and update the 'DIRS' : [] to 'DIRS': [os.path.join(BASE_DIR, 'templates')]
  2. Create a directory at root level named templates. The location of this folder will be project_name/templates
  3. Place all templates here in projects_name/templates that you want to access from all the apps.
    File: project_name/templates/base.html
  4. 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.