【问题标题】:Why load staticfiles for every template even if it is extended?即使扩展了模板,为什么还要为每个模板加载静态文件?
【发布时间】:2012-12-17 23:01:33
【问题描述】:

我有一个 base.html 文件,其中包含一些 'random' html 代码,并且我有以下代码:

{% load staticfiles %}
<!DOCTYPE html>
<html>
   <head>
      ... 
     {% block extra_js_top %}{% endblock %}
   </head>
   ...
</html>

在我的 index.html 文件中,我扩展了 base.html 并加载了一些 extra javascript 文件:

{% extends "base.html" %}
...
{% block extra_js_top %}
   <script type="text/javascript" src="{% static "js/somejs.js" %}"></script>
{% endblock %}

问题是由于静态变量,额外的 javascript 无法加载。即使我扩展模板内有{% load staticfiles %}base.html 也不会加载。最后我解决了这个问题,在 index.html 处再添加一个{% load staticfiles %}

我的问题是为什么我们应该为我们使用的每个模板添加{% load staticfiles %},即使我们扩展了一个已经拥有它的文件?

【问题讨论】:

    标签: python django static django-templates


    【解决方案1】:

    根据 Django 最新的 documentation,这样做是为了为了可维护性和完整性

    当您加载自定义标签或过滤器库时,标签/过滤器是 仅对当前模板可用 - 不是任何父或子 沿模板继承路径的模板。

    例如,如果一个模板 foo.html 有 {% load humanize %},一个子 模板(例如,具有 {% extends "foo.html" %} 的模板)将没有 访问人性化模板标签和过滤器。子模板 负责自己的{% load humanize %}。

    这是一个为了可维护性和健全性而设计的功能。

    【讨论】:

      【解决方案2】:

      因为这是模板标签的工作方式。您需要为使用它们的每个模板文件加载每个库。

      【讨论】:

      • 但是我扩展了一个包含负载的模板。如果完全继承而不是在每个模板中加载库,会不会更好?
      【解决方案3】:

      您需要{% load staticfiles %} 来进行 url 扩展是合乎逻辑的。如果您在base.htmlindex.html 中都发生了这种情况,则必须在两个地方都包含它(正如您已经想到的那样)。

      【讨论】:

        猜你喜欢
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-23
        • 2016-04-03
        • 2016-06-20
        • 2021-06-25
        相关资源
        最近更新 更多