【发布时间】: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