我是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吗?
我所看到的只是压缩,到目前为止,无数次搜索都是空的。
答案 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文件,并以适合您网页的形式提供文件名列表。
显然这并不适用于所有用例