开发者

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',
)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜