這可能是一個愚蠢的問題,但我找不到任何明確的答案。Geodjango管理員,顯示pointfield不如地圖
如何更改Django Admin中的顯示,使得Pointfield不會像OpenLayer Map一樣顯示,而是顯示爲常規輸入字段。我需要看到長,拉特調試..
我是否必須改變字段類型?小工具?
謝謝!
這可能是一個愚蠢的問題,但我找不到任何明確的答案。Geodjango管理員,顯示pointfield不如地圖
如何更改Django Admin中的顯示,使得Pointfield不會像OpenLayer Map一樣顯示,而是顯示爲常規輸入字段。我需要看到長,拉特調試..
我是否必須改變字段類型?小工具?
謝謝!
更新
這是我最後所-at設法保持了lattitude和經度不同的領域,而無需將其保存在數據庫中,因爲該值已經保存在PointField。
的理念是:
models.py
from django.contrib.gis.db import models as geomodels
class Entry(geomodels.Model):
point = geomodels.PointField(
srid=4326,
blank=True,
)
admin.py
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 __init__(self, *args, **kwargs):
if args: # If args exist
data = args[0]
if data['latitude'] and data['longitude']: #If lat/lng exist
latitude = float(data['latitude'])
longitude = float(data['longitude'])
data['point'] = Point(longitude, latitude) # Set PointField
try:
coordinates = kwargs['instance'].point.tuple #If PointField exists
initial = kwargs.get('initial', {})
initial['latitude'] = coordinates[0] #Set Latitude from coordinates
initial['longitude'] = coordinates[1] #Set Longitude from coordinates
kwargs['initial'] = initial
except (KeyError, AttributeError):
pass
super().__init__(*args, **kwargs)
從我們看到它的使用OpenLayersWidget其中inherits來自BaseGeometryWidget。
結論是,在這個類中,變量display_raw默認設置爲False
。
如果您在yourapp/admin.py
其設置爲True
,你會得到與lat和長等數據的文本框,用於調試:
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同時擁有地圖和手動插入經度/緯度的永久性(不僅用於調試)。
想法是使用FloatFields插入經度/緯度並用插入的數據更新PointField。
您可以用Django admin中的另一個控件來重寫一個窗口小部件。 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覆蓋它即可。
[GeoDjango PointField admin visualization]的可能重複(http://stackoverflow.com/questions/19231109/geodjango-pointfield-admin-visualization) –