Django:如何处理特定于模板标签的css/js?
背景:
我有一个 css
文件和一个 js
文件,它们只在 Google 地图的模板标签中使用。我会在需要的地方把它们放到我的模板里。
Inside template tag google_map:
...
...
return render_to_string('google_map.html', context)
在 google_map.html
文件里,我有需要的 css
和 js
:
<link rel="stylesheet" type="text/css" href="mystyle.css" />
我的问题是:
我有一个页面上有 3 个地图,也就是说调用了 3 次模板标签。这就导致 css
和 js
在同一个页面里被引入了 3 次。[这是不应该发生的]
现在,我不能把这些 css
和 js
放在页面的头部,因为并不是所有页面都有地图,这样的话在那些没有地图的页面上就会造成负担。
我应该怎么做,才能确保如果一个页面有 3 个或更多的地图,css
和 js
只被引入一次,而不是重复引入?
2 个回答
0
你可以在你扩展的基础模板的 <head>
部分使用一个新的 django 块:
<head>
/* ... other css/js calls */
{% block googlemapassets %}{% endblock %}
</head>
然后在视图模板中(假设 content
是你主要的内容块):
{% block content %}
{% google_map %}
{% endblock %}
{% block googlemapassets %}
<link rel="stylesheet" type="text/css" href="mystyle.css" />
{% endblock %}
5
我建议你按照Paul Irish提出的一个模式来做,这个模式是关于如何在网页加载完成后执行JavaScript的。这个方法有很多好处,比如封装和命名空间等,但对你来说,最主要的好处是可以根据网页的
标签上的id或class来决定是否执行JavaScript。所以在你的基础模板中,把
标签改成下面这样的:<body class="{% block body_class %}{% endblock %}">
然后,对于需要地图的模板,只需这样做:
{% block body_class %}{% if block.super %}{{ block.super }} {% endif %}maps{% endblock %}
这看起来有点复杂,但其实它只是继承了任何父模板为这个部分设置的值。if
块是用来根据多个类之间需要的空间来决定是否包含这个空间的。
最后,在你的JavaScript中,你只需像文章中描述的那样为“地图”创建一个模块,把所有与地图相关的JavaScript放在那里。