Django:如何处理特定于模板标签的css/js?

2 投票
2 回答
2958 浏览
提问于 2025-04-17 11:57

背景:

我有一个 css 文件和一个 js 文件,它们只在 Google 地图的模板标签中使用。我会在需要的地方把它们放到我的模板里。

Inside template tag google_map:
...
...
return render_to_string('google_map.html', context)

google_map.html 文件里,我有需要的 cssjs

<link rel="stylesheet" type="text/css" href="mystyle.css" />

我的问题是:

我有一个页面上有 3 个地图,也就是说调用了 3 次模板标签。这就导致 cssjs 在同一个页面里被引入了 3 次。[这是不应该发生的]

现在,我不能把这些 cssjs 放在页面的头部,因为并不是所有页面都有地图,这样的话在那些没有地图的页面上就会造成负担。

我应该怎么做,才能确保如果一个页面有 3 个或更多的地图,cssjs 只被引入一次,而不是重复引入?

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放在那里。

撰写回答