== Extending templates ==
(Originally posted here by Simon Willison on 6th August 2008)
Django's template inheritance mechanism allows templates to extend other templates and replace named blocks within them. See here for a full explanation: http://www.djangoproject.com/documentation/templates/#template-inheritance
This feature becomes even more powerful when coupled with Django's template path concept, as discussed by Jeff Croft in this article: http://jeffcroft.com/blog/2008/aug/05/default-templates-django/
A frequently requested feature is the ability to provide an over-ride template that also extends itself. Consider the following:
{{{
# In settings.py
TEMPLATE_DIRS = ('/var/templates/default', '/var/templates/mysite')
# In default/homepage.html
BIG COMPLEX TEMPLATE HERE
{% block stylesheets %}{% endblock %}
MORE BIG COMPLEX TEMPLATE HERE
# In mysite/homepage.html
{% extends "homepage.html" %}
{% block stylesheets %}{% endblock %}
}}}
In other words, we want mysite/homepage.html to reuse default/homepage.html almost entirely, only replacing the stylesheets named block.
The above won't work - Django will throw confusing errors.
It turns out it IS possible to get this to work, if you're willing to do some devious tricks with your TEMPLATE_DIRS setting. Consider the following:
{{{
# In settings.py
TEMPLATE_DIRS = ('/var/templates/default', '/var/templates/mysite', '/var/templates')
# In mysite/homepage.html
{% extends "default/homepage.html" %}
{% block stylesheets %}{% endblock %}
}}}
hello
An alternative approach without using the parent directory trick: http://github.com/stephenmcd/django-overextends