5

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

我查看了这一点域的纬度/经度小部件?但无法让它在 Django 1.6b4 中以任何方式工作

谢谢

4

4 回答 4

7

正如 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},
    }
于 2016-02-18T18:47:08.853 回答
2

您可以在 Django admin 中用另一个小部件覆盖一个小部件。从文档-

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},
    }

这会覆盖TextField. RichTextEditorWidget只需找到点字段的字段类型并用 TextField 覆盖它。

于 2014-03-02T18:43:52.630 回答
1

如果您是 gis 新手,并且不知道 point 是在哪里定义的,那么上面的 LatLongWidget 需要知道 Point 是什么。您可以像这样导入它:

from django.contrib.gis.geos.point import Point
于 2017-11-20T21:53:45.487 回答
0

在这篇文章中,我通过在ModelForm. 这样,LatitudeLongitude字段出现在管理员中是为了方便用户,而不会影响数据库。

如果存在,它们总是反映相关值,而如果不PointField存在,它们可以更新它们或创建它们PointField

于 2014-03-10T18:54:21.700 回答