Geodjango管理员,显示点域不是地图
这可能是个愚蠢的问题,但我找不到任何明确的答案 如何更改Django管理中的显示,使Pointfield不会显示为OpenLayer地图,而是显示为常规输入字段。我需要查看长的、用于调试的lat 我必须更改字段类型吗?小部件Geodjango管理员,显示点域不是地图,django,admin,point,geodjango,Django,Admin,Point,Geodjango,这可能是个愚蠢的问题,但我找不到任何明确的答案 如何更改Django管理中的显示,使Pointfield不会显示为OpenLayer地图,而是显示为常规输入字段。我需要查看长的、用于调试的lat 我必须更改字段类型吗?小部件 谢谢 您可以在Django admin中用另一个小部件覆盖小部件。- 这将用RichTextEditorWidget覆盖TextField。只需找到点域的域类型,并用TextField覆盖它。更新 这就是我如何管理——最后——为latitude和longitude保留单独的
谢谢 您可以在Django admin中用另一个小部件覆盖小部件。-
这将用
RichTextEditorWidget
覆盖TextField
。只需找到点域的域类型,并用TextField覆盖它。更新
这就是我如何管理——最后——为latitude和longitude保留单独的字段,而不必将它们保存在数据库中,因为值已经保存在PointField中
这个想法是:
- 如果我们插入一个新条目,纬度和经度字段将用于设置PointField
- 如果我们打开一个现有的PointField条目,它将用于提供相关FormFields中的纬度和经度值
from django.contrib.gis.db import models as geomodels
class Entry(geomodels.Model):
point = geomodels.PointField(
srid=4326,
blank=True,
)
管理员
from myapp.forms import EntryForm
from django.contrib import admin
class EntryAdmin(admin.ModelAdmin):
form = EntryForm
admin.site.register(Entry, EntryAdmin)
forms.py
from django import forms
from myapp.models import Entry
from django.contrib.gis.geos import Point
class MarketEntryForm(forms.ModelForm):
latitude = forms.DecimalField(
min_value=-90,
max_value=90,
required=True,
)
longitude = forms.DecimalField(
min_value=-180,
max_value=180,
required=True,
)
class Meta(object):
model = MarketEntry
exclude = []
widgets = {'point': forms.HiddenInput()}
def clean(self):
super().clean()
if any(x for x in ['latitude', 'longitude'] if x in self.changed_data):
latitude = float(self.cleaned_data['latitude'])
longitude = float(self.cleaned_data['longitude'])
self.cleaned_data['point'] = Point(longitude, latitude)
def __init__(self, *args, **kwargs):
try:
coordinates = kwargs['instance'].point.tuple #If PointField exists
initial = kwargs.get('initial', {})
initial['longitude'] = coordinates[0] #Set longitude from coordinates
initial['latitude'] = coordinates[1] #Set Latitude from coordinates
kwargs['initial'] = initial
except (KeyError, AttributeError):
pass
super().__init__(*args, **kwargs)
从中我们可以看出,它使用的是 结论是,在这个类中,变量默认设置为
False
如果在yourapp/admin.py
中将其设置为True
,您将得到一个文本框,其中包含lat、long和其他数据,对调试非常有用:
from django.contrib.gis import admin
from yourapp.models import YourClass
from django.contrib.gis import forms
from django.contrib.gis.db import models
class YourClassAdminForm(forms.ModelForm):
your_attribute = forms.PointField(widget=forms.OSMWidget(attrs={
'display_raw': True}))
class YourClassAdmin(admin.GeoModelAdmin):
form = YourClassAdminForm
admin.site.register(YourClass, YourClassAdmin)
永久拥有地图和手动插入经度/纬度(不仅用于调试) 其思想是使用FloatFields插入经度/纬度,并使用插入的数据更新PointField 可能重复的
from django.contrib.gis import admin
from yourapp.models import YourClass
from django.contrib.gis import forms
from django.contrib.gis.db import models
class YourClassAdminForm(forms.ModelForm):
your_attribute = forms.PointField(widget=forms.OSMWidget(attrs={
'display_raw': True}))
class YourClassAdmin(admin.GeoModelAdmin):
form = YourClassAdminForm
admin.site.register(YourClass, YourClassAdmin)