Django如何在子模板中动态添加js和CSS?

时间:2016-01-14 22:34:23

标签: django django-templates

我是Django的新手。

我设置了一个基本模板,我使用{% block body %}{% endblock %}使用base.html来包含index.html和test.html的子模板,其顶部有{% extends 'base.html' %}

base.html模板包含Bootstrap。它是包含CSS和JS的地方。 index.html需要包含select2,但test.html不包括。

我可以在这里使用块来解决我的问题(将CSS和JS块添加到base.html),但我发现它很快就会变得非常混乱。

无论如何我可以在Django中使用资源来创建一个select2资产,并在子模板中调用它来向父模板注册所需的JS和CSS吗?

我所看到的只是压缩,到目前为止,无数次搜索都是空的。

2 个答案:

答案 0 :(得分:4)

可以在base.html中添加2个块:

<some css>
{% block additional_css %}
{% endblock additional_css %}

...

<some js>
{% block additional_js %}
{% endblock additional_js %}

并在从base.html扩展的任何页面中覆盖它们:

{% extends "base.html" %}

{% block additional_css %}
    <link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap-datetimepicker.min.css' %}">
{% endblock additional_css %}

...

{% block additional_js %}
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.0/moment.min.js"></script>
    <script type="text/javascript" src="{% static 'js/bootstrap-datetimepicker.min.js' %}"></script>
{% endblock additional_js %}

这是一个很好的做法,因为在这种情况下脚本将在最后加载,如果你添加的一些脚本需要例如JQuery,你就不会遇到任何问题。

它不会使代码变得混乱,它平坦且易于解释。考虑如何不使JS变得混乱更好,正如你所指出的,有几种方法可以做到这一点,它们就是压缩所有的JS。

答案 1 :(得分:1)

我可以想到几个选项

第一种是涉及base.html中{% if include_my_js_please %}的丑陋方式,如果没有包含上下文变量,则会忽略该方法,并且由于显而易见的原因,如果它进入我们的生产中,将会有参数代码

第二种是你说的方式会变得非常混乱,但是我们这样做并且对我们非常有效,我们在base.html中有{% extended_head %}{% extended_footer %}您希望我们在需要时谨慎使用。虽然我们对此包含的内容非常谨慎。

第三种方法是将所有内容都包含在base.html中,只有当它真正成为一个问题时才会担心它(我可以看到它的优缺点)

我能想到的第四种也是最后一种方法是使用Forms Media class

  

Django允许您将不同的文件(如样式表和脚本)与需要这些资源的表单和小部件相关联。例如,如果要使用日历来呈现DateField,则可以定义自定义Calendar小部件。然后,此小部件可以与呈现日历所需的CSS和JavaScript相关联。当在表单上使用Calendar小部件时,Django能够识别所需的CSS和JavaScript文件,并以适合您网页的形式提供文件名列表。

显然这并不适用于所有用例