这可能是一个愚蠢的问题,但我找不到任何明确的答案。
如何更改Django Admin中的显示,以便Pointfield不会像OpenLayer Map那样显示,而是作为常规输入字段显示。我需要查看冗长的调试时间。
我必须更改字段类型吗?小部件?
谢谢!
最佳答案
更新
这就是我最后设法保留纬度和经度的单独字段而不必将其保存在数据库中的方式,因为值已经保存在PointField中。
这个想法是:
models.py
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)
表格
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)
从source code of PointField中,我们看到其form class使用了OpenLayersWidget,而inherits来自BaseGeometryWidget。
结论是,在此类中,变量display_raw默认情况下设置为
False
。如果将其设置为
True
中的yourapp/admin.py
,则将获得一个包含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)
There is also a way永久拥有 map 和经度/纬度的手动插入(不仅用于调试)。
这个想法是使用FloatFields插入经度/纬度,并使用插入的数据更新PointField。
关于django - Geodjango管理员,不以 map 显示点场,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21408638/