EVG
EVG

Reputation: 285

django extends problem - the child template is not showing

I've already configured the necessary things to work the extends template function in django. here's my codes:

in settings.py

def my_dir():
    import os.path
    return os.path.abspath(os.path.dirname(__file__))
TEMPLATE_DIRS = ( my_dir() + '/app/templates', ) #dynamic template directory

in base.html - located in app/templates/site

....
<div id="SideBar" class="FloatLeft">
{% block sidebar %} {% endblock %}
</div>
....

in sidebar.html - located in app/templates/site

{% extends "site/base.html" %}
{% block sidebar %}
   some code here
{% endblock %}

I've tried also the {% include "site/sidebar.html"%} tag in the base.html to check the template directory, and yes include tag is working...

what's the problem in the {% extends %} ? why does it doesnt detect its parent template..

please help me guys.. your help is greatly appreciated... im still waiting for the answer.. tnx

Upvotes: 8

Views: 10505

Answers (7)

Conrad Selig
Conrad Selig

Reputation: 401

The answer Daniel Roseman gave is spot on, but there is a quick and easy way around this if pointing to your child template is not practical (as it might not be with more complex projects).

In your child template, remove the {% extends "" %} tags you have that are pointing to your parent.

In your parent template, replace {% block content %} with {% include "path/to/child/template" %}

That's it! Your child template will now load into the block content exactly as if you had rendered it directly.

Upvotes: 2

Marc Demierre
Marc Demierre

Reputation: 1108

I am not sure what yout problem is, but you should check the following points :

  • The {% extends %} tage should be the first one in the template file (and put a blank line afterwards to be sure)
  • I think that the reference to the base template is relative to you TEMPLATE_DIR. Try different things like putting both templates at the same level etc.
  • Check all the tags in both templates to be sure that they are all correctly formatted
  • Check the encoding of the files. If it is UTF-8, try to disable the BOM in both files.
  • Maybe it is a problem with your directory setting. Try to hard code the absolute path to check that.

These are the problems I can imagine, but I can't guarantee that it will work.

Upvotes: 2

Daniel Roseman
Daniel Roseman

Reputation: 599610

Which template are you rendering in your view? It should be the child, not the parent.

Upvotes: 16

zsquare
zsquare

Reputation: 10146

Are you sure you have the proper template loaders setup? You should have this in your settings.py:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

Upvotes: 1

Srikar Appalaraju
Srikar Appalaraju

Reputation: 73608

Use os.path.join to combine 2 directories.

import os.path
TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates'),
)

Here I am assuming that templates is a directory where you keep your templates. Now, to access the templates this is the base directory for them. So to extend base.html in some other file do like this -

{% extends "base.html" %}
...
{% endblock %}

Upvotes: 1

Mike Axiak
Mike Axiak

Reputation: 12004

Your main issue is that you're forgetting a comma in the TEMPLATE_DIRS setting. Try this:

TEMPLATE_DIRS = ( my_dir() + '/app/templates', )

Please disregard cheshire's answer.

Upvotes: 1

George Karpenkov
George Karpenkov

Reputation: 2124

There are a lot of problems. The short answer is "No, you can't change template dirs on-the-fly, and even if you could, you would do it definitely not the way you're doing it now"

Upvotes: 1

Related Questions