在GeoDjango中,使用GeoModelAdmin作为Django Admin中的StackedInline

flvtvl50  于 2023-05-08  发布在  Go
关注(0)|答案(1)|浏览(85)

我尝试在Django管理面板中使用GeoModelAdmin作为StackedInline。
我看过这两个类似的问题:

建议从 bothGeoModelAdmin * 和 * StackedInline继承的答案几乎可以工作。下面的代码:

models.py:

class SomeGeometry(gis_models.Model):
  geometry = gis_models.GeometryField(blank=False, null=False)
  some_model = models.ForeignKey("somemodel", blank=False, null=False, on_delete=models.CASCADE, related_name="geometries")

class SomeModel(models.Model):
  name = models.CharField(max_length=255)

admin.py:

class SomeGeometryAdminInline(gis_admin.GeoModelAdmin, admin.StackedInline):
    model = SomeGeometry
    extra = 0
    fields = (
        "geometry",
    )

    def __init__(self, parent_model, admin_site):

        # InlineModelAdmin.__init__
        self.admin_site = admin_site
        self.parent_model = parent_model
        self.opts = self.model._meta
        self.has_registered_model = admin_site.is_registered(self.model)

        # BaseModelAdmin.__init__
        overrides = copy.deepcopy(FORMFIELD_FOR_DBFIELD_DEFAULTS)
        for k, v in self.formfield_overrides.items():
            overrides.setdefault(k, {}).update(v)
        self.formfield_overrides = overrides

@admin.register(SomeModel)
class SomeModelAdmin(admin.ModelAdmin):
    fields = ("name",)
    inlines = (SomeGeometryAdminInline, )

正确显示可编辑几何体构件。但是在内联表单集的底部没有“添加另一个模型”链接。
有没有什么提示可以让这个链接恢复?
如果我显式地设置

formfield_overrides = {
  gis_fields.GeometryField: {
    "widget": gis_widgets.OpenLayersWidget
  }
}

然后小部件看起来像这样:

但是我希望它看起来像这样:

  • (注意右上角的控件,允许我修改几何体)*
anauzrmj

anauzrmj1#

应该有使用OSMWidget和这里是我如何使用以下解决方案:How do I add a custom inline admin widget in Django?
我的型号:

from django.contrib.gis.db import models

class Territory(models.Model):
    poly = models.PolygonField(_('Polygon, borders of territory.'))
    location = models.PointField(_('Location, point on the map.'))

我的内联模型:

from django.contrib.gis.forms.widgets import OSMWidget

class TerritoryStackedInline(admin.StackedInline):
    model = Territory
    extra = 1

    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name in ('poly', 'location'):
            kwargs['widget'] = OSMWidget
        return super().formfield_for_dbfield(db_field,**kwargs)

OSMWidget将模板覆盖到“gis/openlayers-osm.html”,其中发生以下基本层覆盖:

{% block base_layer %}
var base_layer = new ol.layer.Tile({source: new ol.source.OSM()});
{% endblock %}

如果没有它,基本层代码看起来像这样(模板使用“gis/openlayers.html”):

{% block base_layer %}
    var base_layer = new ol.layer.Tile({
        source: new ol.source.XYZ({
            attributions: "NASA Worldview",
            maxZoom: 8,
            url: "https://map1{a-c}.vis.earthdata.nasa.gov/wmts-webmerc/" +
                 "BlueMarble_ShadedRelief_Bathymetry/default/%7BTime%7D/" +
                 "GoogleMapsCompatible_Level8/{z}/{y}/{x}.jpg"
        })
    });
{% endblock %}

你可以看到有不同的来源。

相关问题