Wagtail:在片段与页面模型中编辑 GeoJSON 字段的处理

Wagtail: Edit handling of GeoJSON field in a snippet vs. Page model

我正在尝试实现 Django Leaflet into my Wagtail app. The underlying form field is a GeoJSON 字段。不过,我只有在将我的模型 注册为片段 而不是 Page 模型时才能正常工作。

我可以添加基于 Page 模型的模型实例,并且 GeoJSON 值已正确写入数据库。我还可以编辑要素几何图形 但是 几何图形不会显示在传单地图上。当 Wagtail 为基于 Page 的模型呈现编辑视图时,GeoJSON 变成一个字符串并且反序列化失败:

Error creating geometry from value
'"{\"type\":\"Point\",\"coordinates\":[-322.276779,59.41526]}"'
(String input unrecognized as WKT EWKT, and HEXEWKB.)

为注册为片段的同一模型加载编辑视图,JSON 保持 dict 并且几何图形在传单地图上呈现。所以我怀疑 Wagtails 编辑处理程序在某处对 context 做了一些处理片段时没有做的事情。在哪里看以及如何预防?

我找到了解决办法。我按照错误消息找到了它的方法并覆盖了它。我的小部件现在看起来像这样:

[...]
from leaflet.forms.widgets import LeafletWidget

class LeafletWidgetWithMedia(LeafletWidget):
    include_media = True
    template_name = "widget.html"

    def deserialize(self, value):
        try:
            value = json.loads(value)  # this is the part I added
            return GEOSGeometry(value)
        except (GEOSException, ValueError, TypeError) as err:
            logger.error("Error creating geometry from value '%s' (%s)", value, err)
        return None

我仍然很好奇 Wagtails 内部发生了什么。