You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Django模板标签{% extends %}将JS代码片段插入index.html?

Django模板继承插入JS代码的问题

问题背景

我正在开发一个Django应用,想通过{% extends %}标签把publish_layers_in_html_page.html里的JavaScript代码插入到index.html中,但尝试后未成功。不过直接将这段JS代码插入index.html末尾时,代码可以正常运行。


现有文件内容

原templates/index.html页脚代码

...

</body>

</html>

<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>

<!-- load jquery. I put this after leaflet -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 

<!-- import a library leaflet.browser.print from local folder lib placed in the staticfiles folder -->
<script src="{% static './lib/leaflet.browser.print.min.js' %}"></script>

原templates/publish_layers_in_html_page.html中的JS代码

<script> 
 
var overlayMaps = {};

// Shapefile wms
{% for s in shp %}
var {{ s.name }} = L.tileLayer.wms('http://localhost:8080/geoserver/wms', {
    layers: '{{s.name}}',
    transparent: true,
    format: 'image/png',
})
overlayMaps['{{ s.name }}'] = {{ s.name }}

{% endfor %}

L.control.layers(baseMaps, overlayMaps, {collapsed: false, position: 'topleft'}).addTo(map)

</script>

已尝试的修改

修改后的templates/index.html

...

</body>

</html>

<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>

<!-- load jquery. I put this after leaflet -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 

<!-- import a library leaflet.browser.print from local folder lib placed in the staticfiles folder -->
<script src="{% static './lib/leaflet.browser.print.min.js' %}"></script>

{% block scripts %}{% endblock %}

修改后的templates/publish_layers_in_html_page.html

{% extends "index.html" %}

 {% block scripts %}

<script> 
 
var overlayMaps = {};

// Shapefile wms
{% for s in shp %}
var {{ s.name }} = L.tileLayer.wms('http://localhost:8080/geoserver/wms', {
    layers: '{{s.name}}',
    transparent: true,
    format: 'image/png',
})
overlayMaps['{{ s.name }}'] = {{ s.name }}

{% endfor %}

L.control.layers(baseMaps, overlayMaps, {collapsed: false, position: 'topleft'}).addTo(map)

</script>

{% endblock %}

问题原因及修复方案

问题核心是模板结构不符合HTML规范:index.html中把{% block scripts %}放在了</html>标签外面,浏览器不会解析该标签后的内容,Django模板引擎也无法识别这个区块。

修复步骤

  1. 调整index.html的结构,将所有JS脚本和区块标签移到</body>标签之前、</html>标签之前的位置(所有HTML内容必须包裹在<html>标签内)。
  2. 确保子模板的{% extends %}是第一行代码,避免前置空格。

修复后的templates/index.html

...

<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>

<!-- load jquery. I put this after leaflet -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 

<!-- import a library leaflet.browser.print from local folder lib placed in the staticfiles folder -->
<script src="{% static './lib/leaflet.browser.print.min.js' %}"></script>

{% block scripts %}{% endblock %}
</body>
</html>

修复后的templates/publish_layers_in_html_page.html

{% extends "index.html" %}

{% block scripts %}
<script> 
var overlayMaps = {};

// Shapefile wms
{% for s in shp %}
var {{ s.name }} = L.tileLayer.wms('http://localhost:8080/geoserver/wms', {
    layers: '{{s.name}}',
    transparent: true,
    format: 'image/png',
})
overlayMaps['{{ s.name }}'] = {{ s.name }}
{% endfor %}

L.control.layers(baseMaps, overlayMaps, {collapsed: false, position: 'topleft'}).addTo(map)
</script>
{% endblock %}

额外注意事项

  • 确保视图函数渲染的是publish_layers_in_html_page.html而非原index.html。
  • 子模板的{% extends %}必须是模板的第一行代码,不能有前置空格或其他内容。

内容的提问来源于stack exchange,提问作者Tms91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:03:26