I have a base.html file which has some 'random' html code and I have the following code:
{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
...
{% block extra_js_top %}{% endblock %}
</head>
...
</html>
In my index.html file I extend base.html and I load some extra javascript files:
{% extends "base.html" %}
...
{% block extra_js_top %}
<script type="text/javascript" src="{% static "js/somejs.js" %}"></script>
{% endblock %}
The problem is that extra javascript doesn't load because of the static var. It doesn't load even if I extend base.html which have the {% load staticfiles %}
inside the template. Finally I solved the problem adding one more {% load staticfiles %}
at index.html.
My question is why we should add {% load staticfiles %}
for every template we use even if we extend a file that has it already?
As per Django's latest documentation, this is done for the sake of maintainability and sanity
When you load a custom tag or filter library, the tags/filters are
only made available to the current template – not any parent or child
templates along the template-inheritance path.
For example, if a template foo.html has {% load humanize %}, a child
template (e.g., one that has {% extends "foo.html" %}) will not have
access to the humanize template tags and filters. The child template
is responsible for its own {% load humanize %}.
This is a feature for the sake of maintainability and sanity.
Because that's the way template tags work. You need to load each library for every template file that uses them.
It's logical that you'll need {% load staticfiles %}
wherever you want url expansion to occur. If you have that happening in both base.html
& index.html
, you'll have to include it at both places (as you've already figured).