Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Global base.html template

I am new to Django. I am using Django 1.8.6 with Python 2.7. I am trying to use a base.html template that can be used globaly through out the entire site, where every app and access it. Here is my test site's current structure:

twms

polls

migrations

static

templates

project

migrations

static

templates

project

index.html

tmws

static

templates

tmws

base.html

Here is the code for project/templates/project/index.html

{% extends 'tmws/base.html' %}
{% block content %}
    <h1>Projects</h1>
    <ul>
    {% for project in project_list %}
        <li><a href="{% url 'project:detail' project.id %}">{{ project.name }}</a></li>
    {% endfor %}

    </ul>
    end of list
{% endblock %}

This is the error I am receiving:

TemplateDoesNotExist at /project/

tmws/base.html

How do I access tmws/tmws/templates/tmws/base.html from any of my apps?

Any help would be greatly appreciated!

Let me know if any additional information is needed.

EDIT

Here are my template settings from settings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),  # If i leave both or just comment one one out I still get the same error
            'tmws.tmws.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',
            ],
        },
    },
]
like image 728
user908759 Avatar asked Feb 06 '16 20:02

user908759


People also ask

HOW include HTML in Django?

include tag loads a template and renders it with the current context. This is a way of “including” other templates within a template. The template name can either be a variable or a hard-coded (quoted) string, in either single or double quotes.

What is App_dirs in Django?

With APP_DIRS set to True , the template loader will look in the app's templates directory and find the templates.

Does Django use jinja2?

Django sets Jinja with two default behaviors, one for when DEBUG=True -- a common setting in development -- and the other for when DEBUG=False -- a common setting in production. If DEBUG=True and an invalid variable is set in a Jinja template, Jinja uses the jinja2.

What does {% %} mean in Django?

{% %} and {{ }} are part of Django templating language. They are used to pass the variables from views to template. {% %} is basically used when you have an expression and are called tags while {{ }} is used to simply access the variable.


1 Answers

I think you might be having a problem with your template directory configuration. In your project´s settings.py try to check if you have a configuration similar to this one:

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, 'your template dir name')]
        ,
        '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',
            ],
        },
    },
]

Where 'your template dir name' should be tmws. This will make django search for this directory whenever you try to extend templates in your HTML. You can add as many directories as you want.

I think right now Django must be searching for the template in:

twms/project/templates/project

So maybe if you place your base.html file there Django will be able to find it.

Another suggestion would be to create a general templates directory and place your base.html there since you want it to be used in the entire site. This is just my taste for ordering templates, but it should work either way.

Edit:

Adding the following in settings.py solved the problem. Read comments for more info:

MASTER_BASE_DIR = os.path.dirname(__file__)




TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(MASTER_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',
                ],
            },
        },
    ]
like image 193
Pablo Estrada Avatar answered Oct 01 '22 02:10

Pablo Estrada