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 m开发者_如何学运维y 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
Which template are you rendering in your view? It should be the child, not the parent.
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.
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.
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"
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.
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 %}
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',
)
精彩评论