Reputation: 527
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?
Upvotes: 28
Views: 8547
Reputation: 15620
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.
Upvotes: 31
Reputation: 18579
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).
Upvotes: 0
Reputation: 599956
Because that's the way template tags work. You need to load each library for every template file that uses them.
Upvotes: 3