GeoDjango PointField 管理员可视化

5

我想知道如何在管理界面中更改默认的PointField可视化(即Openstreetmap),以便我可以输入简单的经纬度,而不是在地图上选择点?

我查看了这个链接Latitude/longitude widget for pointfield?,但无论如何都不能在Django 1.6b4中实现它。

谢谢

4个回答

8

正如Bibhas所说,您可以覆盖用于字段的小部件,但简单的文本输入可能没有用。因此,这里有一个示例,使用可以用于geodjango的PointField的完整小部件:

class LatLongWidget(forms.MultiWidget):
    """
    A Widget that splits Point input into latitude/longitude text inputs.
    """

    def __init__(self, attrs=None, date_format=None, time_format=None):
        widgets = (forms.TextInput(attrs=attrs),
                   forms.TextInput(attrs=attrs))
        super(LatLongWidget, self).__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            return tuple(value.coords)
        return (None, None)

    def value_from_datadict(self, data, files, name):
        mylat = data[name + '_0']
        mylong = data[name + '_1']

        try:
            point = Point(float(mylat), float(mylong))
        except ValueError:
            return ''

        return point

现在,您可以覆盖您的模型管理器:

from django.contrib.gis.db import models as geomodels
class CompanyAdmin(admin.ModelAdmin):
    list_display = ('name', 'approval', 'company_view',)
    list_filter = ('approval',)
    formfield_overrides = {
        geomodels.PointField: {'widget': LatLongWidget},
    }

这个在每次保存时都会反转它们,我认为在解压缩时应该将其移除。 - Bufke

2
您可以在Django管理界面中用另一个小部件覆盖一个小部件。从文档中了解更多信息。
from django.db import models
from django.contrib import admin

# Import our custom widget and our model from where they're defined
from myapp.widgets import RichTextEditorWidget
from myapp.models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.TextField: {'widget': RichTextEditorWidget},
    }

这将使用 RichTextEditorWidget 覆盖 TextField。只需找到点字段的字段类型并用 TextField 进行覆盖。


1

如果你是GIS的新手,不知道点是如何定义的,那么上面的LatLongWidget需要知道什么是Point。你可以像这样导入它:

from django.contrib.gis.geos.point import Point

0

在这篇文章中,我通过在ModelForm中使用两个额外的“十进制字段”来解决这个问题。这样,LatitudeLongitude字段会出现在管理员界面上,方便用户使用,而不会对数据库产生任何影响。

如果存在PointField,它们始终反映相关值,而如果不存在PointField,则可以更新或创建它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接