Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why load staticfiles for every template even if it is extended?

Tags:

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?

like image 467
dastergon Avatar asked Jan 03 '13 14:01

dastergon


People also ask

Can you extend more than one template Django?

Yes you can extend different or same templates.

What is load in Django template?

For a hands-on example of creating HTML pages with templates, see Tutorial 3. Django defines a standard API for loading and rendering templates regardless of the backend. Loading consists of finding the template for a given identifier and preprocessing it, usually compiling it to an in-memory representation.

What is extends Django?

extends tag is used for inheritance of templates in django. One needs to repeat the same code again and again. Using extends we can inherit templates as well as variables. Syntax: {% extends 'template_name.html' %}


2 Answers

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.

like image 135
Anupam Avatar answered Oct 13 '22 01:10

Anupam


Because that's the way template tags work. You need to load each library for every template file that uses them.

like image 25
Daniel Roseman Avatar answered Oct 13 '22 00:10

Daniel Roseman