2014-01-28 33 views
4

這可能是一個愚蠢的問題,但我找不到任何明確的答案。Geodjango管理員,顯示pointfield不如地圖

如何更改Django Admin中的顯示,使得Pointfield不會像OpenLayer Map一樣顯示,而是顯示爲常規輸入字段。我需要看到長,拉特調試..

我是否必須改變字段類型?小工具?

謝謝!

+0

[GeoDjango PointField admin visualization]的可能重複(http://stackoverflow.com/questions/19231109/geodjango-pointfield-admin-visualization) –

回答

6

更新

這是我最後所-at設法保持了lattitude和經度不同的領域,而無需將其保存在數據庫中,因爲該值已經保存在PointField。

的理念是:

  • 如果我們插入一個新條目,緯度和經度字段將被用於設置PointField
  • 如果我們打開一個現有PointField項,它會被用來在相關的FormField中提供緯度和經度值。

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。

1

您可以用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}, 
    } 

這將覆蓋TextFieldRichTextEditorWidget。只需找到點字段的字段類型並使用TextField覆蓋它即可。