我想知道如何在管理中更改默认的PointField可视化(Openstreetmap),以便我可以输入简单的纬度/经度而不是选择地图上的点?GeoDjango PointField管理可视化
我看着这一个Latitude/longitude widget for pointfield?但却无法以任何方式工作在Django 1.6b4
感谢
我想知道如何在管理中更改默认的PointField可视化(Openstreetmap),以便我可以输入简单的纬度/经度而不是选择地图上的点?GeoDjango PointField管理可视化
我看着这一个Latitude/longitude widget for pointfield?但却无法以任何方式工作在Django 1.6b4
感谢
您可以覆盖一个小部件与另一个在Django管理。 From the documentation -
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覆盖它即可。
In this post我通过在ModelForm
中使用两个额外的“十进制字段”来解决此问题。这样,Latitude
和Longitude
字段出现在管理员用户的方便,而不会影响数据库,无论如何。
如果PointField
存在,他们总是会反映相关的值,而他们可以更新它们或在PointField
不存在的情况下创建它们。
由于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},
}
如果你是新的GIS和你不知道在哪里定义点,上面的LatLongWidget需要知道Point是什么。你可以像这样导入它:
from django.contrib.gis.geos.point import Point
这将在每次保存时反转它们,我认为反转应该在解压缩中删除。 – Bufke
你是对的@Bufke修复! –