3

我修改了 ../contrib/gis/admin/options.py 中的一些代码以及 ../contrib/gis/templates/admin 中的 openlayers.js 文件。

它像这样工作得很好,但我不能让它们那样,因为它们将在 django 更新的情况下被替换!所以我想在我的项目中复制这些文件,并将原始文件留在 /django/contrib ...

任何帮助将不胜感激。

4

1 回答 1

0

这是一个示例,我们要更改管理区域中使用的默认地图图层。默认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.htmlbase_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
于 2022-01-05T11:48:45.477 回答