【问题标题】:How to set default_lon, default_lat for admin page using GISModelAdmin如何使用 GISModelAdmin 为管理页面设置 default_lon、default_lat
【发布时间】:2025-12-29 11:20:39
【问题描述】:

如何使用 GISModelAdmin 类在 django 管理页面中为 PointField 设置 default_lon、default_lat 和 default_zoom?

使用以下代码可以正确加载管理页面,但默认位置在欧洲。

模型.py

from django.contrib.gis.db import models
class Enclosure(models.Model):
    location = models.PointField()
    name = models.CharField(max_length=15)

admin.py

from .models import Enclosure
@admin.register(Enclosure)
class EnclocusreAdmin(GISModelAdmin):
    pass

我尝试了以下代码来尝试为小部件设置默认纬度、经度。但是,这样做会导致管理页面上的 PointField 没有显示地图。

admin.py

from .models import Enclosure
@admin.register(Enclosuer)
class EnclosureAdmin(GISModelAdmin):
    gis_widget_kwargs = {
        'attrs': {
            'default_lon': 40.383546,
            'default_lat': -111.774973,
        }
    }

相关的Django代码是

class GISModelAdmin(GeoModelAdminMixin, ModelAdmin):
    pass

class GeoModelAdminMixin:
    gis_widget = OSMWidget
    gis_widget_kwargs = {}

    def formfield_for_dbfield(self, db_field, request, **kwargs):
        if (
            isinstance(db_field, models.GeometryField) and
            (db_field.dim < 3 or self.gis_widget.supports_3d)
        ):
            kwargs['widget'] = self.gis_widget(**self.gis_widget_kwargs)
            return db_field.formfield(**kwargs)
        else:
            return super().formfield_for_dbfield(db_field, request, **kwargs)

class OSMWidget(OpenLayersWidget):
    """
    An OpenLayers/OpenStreetMap-based widget.
    """
    template_name = 'gis/openlayers-osm.html'
    default_lon = 5
    default_lat = 47
    default_zoom = 12

    def __init__(self, attrs=None):
        super().__init__()
        for key in ('default_lon', 'default_lat', 'default_zoom'):
            self.attrs[key] = getattr(self, key)
        if attrs:
            self.attrs.update(attrs)

【问题讨论】:

    标签: python django gis geodjango


    【解决方案1】:

    子类化GISModelAdmin 似乎有效:在admin.py

    from django.contrib.gis import admin
    from .models import Enclosure
    
    class CustomGeoWidgetAdmin(admin.GISModelAdmin):
        gis_widget_kwargs = {
            'attrs': {
                'default_zoom': 11,
                'default_lon': 10,
                'default_lat': 43,
            },
        }
    
    @admin.register(Enclosure)
    class EnclosureAdmin(CustomGeoWidgetAdmin):
        pass
    

    【讨论】:

    • 这实际上就是我正在做的事情。问题是我正在转换纬度和经度,并且该位置不是有效的坐标。它不会抛出错误,也不会像我使用的其他系统一样将位置更改为地图边缘。地图根本无法加载。我编辑了我的问题以显示我使用的实际坐标。
    • 确实,好像没有什么可以验证经纬度在正确的范围内...
    最近更新 更多