我修改了 ../contrib/gis/admin/options.py 中的一些代码以及 ../contrib/gis/templates/admin 中的 openlayers.js 文件。
它像这样工作得很好,但我不能让它们那样,因为它们将在 django 更新的情况下被替换!所以我想在我的项目中复制这些文件,并将原始文件留在 /django/contrib ...
任何帮助将不胜感激。
这是一个示例,我们要更改管理区域中使用的默认地图图层。默认OSMWidget
使用模板django/contrib/gis/templates/gis/openlayers.html
,因为它的属性template_name
设置为gis/openlayers-osm.html
。它看起来像这样:
{% extends "gis/openlayers.html" %}
{% load l10n %}
{% block options %}{{ block.super }}
options['default_lon'] = {{ default_lon|unlocalize }};
options['default_lat'] = {{ default_lat|unlocalize }};
options['default_zoom'] = {{ default_zoom|unlocalize }};
{% endblock %}
{% block base_layer %}
var base_layer = new ol.layer.Tile({source: new ol.source.OSM()});
{% endblock %}
我们想在这里改变base_layer
变量。而不是直接修改这个模板,覆盖它!在项目的模板目录中创建一个模板文件,例如gis/custom_layers.html
;base_layer
并使用您想要的任何图块进行修改:
{% extends "gis/openlayers-osm.html" %}
{% load l10n %}
{% block base_layer %}
var base_layer = new ol.layer.Tile({
source: new ol.source.XYZ({
attributions: '<a href="https://www.thunderforest.com/">Thunderforest</a>',
url: "https://tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey=<your API key>"
})
});
{% endblock %}
然后在admin.py
您可以子类OSMWidget
化并指定自定义模板。GISModelAdmin
与 Django 4.0 一起使用,admin.py
可能如下所示:
from django.contrib.gis import admin
from django.contrib.gis.forms.widgets import OSMWidget
from .models import MyModel
class CustomGeoWidget(OSMWidget):
template_name = 'gis/custom_layers.html'
class CustomGeoModelAdmin(admin.GISModelAdmin):
gis_widget = CustomGeoWidget
gis_widget_kwargs = {
'attrs': {
'default_zoom': 14,
'default_lon': 3.4825,
'default_lat': 50.1906,
},
}
@admin.register(MyModel)
class MyModelAdmin(CustomGeoModelAdmin):
pass