C'è un widget per PointField come ingressi separati di latitudine/longitudine? Come SplitDateTimeWidget per DateTimeField.Widget latitudine/longitudine per pointfield?
risposta
Ecco il mio lavoro campo personalizzato e widget di:
class LatLongWidget(forms.MultiWidget):
"""
A Widget that splits Point input into two latitude/longitude boxes.
"""
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(reversed(value.coords))
return (None, None)
class LatLongField(forms.MultiValueField):
widget = LatLongWidget
srid = 4326
default_error_messages = {
'invalid_latitude' : _('Enter a valid latitude.'),
'invalid_longitude' : _('Enter a valid longitude.'),
}
def __init__(self, *args, **kwargs):
fields = (forms.FloatField(min_value=-90, max_value=90),
forms.FloatField(min_value=-180, max_value=180))
super(LatLongField, self).__init__(fields, *args, **kwargs)
def compress(self, data_list):
if data_list:
# Raise a validation error if latitude or longitude is empty
# (possible if LatLongField has required=False).
if data_list[0] in validators.EMPTY_VALUES:
raise forms.ValidationError(self.error_messages['invalid_latitude'])
if data_list[1] in validators.EMPTY_VALUES:
raise forms.ValidationError(self.error_messages['invalid_longitude'])
# SRID=4326;POINT(1.12345789 1.123456789)
srid_str = 'SRID=%d'%self.srid
point_str = 'POINT(%f %f)'%tuple(reversed(data_list))
return ';'.join([srid_str, point_str])
return None
Creare un widget personalizzato per questo, è possibile ottenere ispirato da SelectDateWidget
here.
@Ramast, si avvicina lo stesso problema in modo più divinatorio. Ho incorporato le modifiche al mio codice, è bello migliorare sempre.
Questo è come sono riuscito -a ultimo- di tenere campi separati per lattitude e la longitudine, senza dover salvarli nel database in quanto i valori sono già salvati nella PointField.
L'idea è:
- Se stiamo inserendo una nuova voce, i campi latitudine e longitudine saranno utilizzati per impostare il PointField
- Se apriamo una voce PointField esistente, saranno utilizzati per fornire i valori di latitudine e longitudine nei campi modulo pertinenti.
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.FloatField(
min_value=-90,
max_value=90,
required=True,
)
longitude = forms.FloatField(
min_value=-180,
max_value=180,
required=True,
)
class Meta(object):
model = MarketEntry
exclude = []
widgets = {'point': forms.HiddenInput()}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
coordinates = self.initial.get('point', None)
if isinstance(coordinates, Point):
self.initial['latitude'], self.initial['longitude'] = coordinates.tuple
def clean(self):
data = super().clean()
latitude = data.get('latitude')
longitude = data.get('longitude')
point = data.get('point')
if latitude and longitude and not point:
data['point'] = Point(longitude, latitude)
return data
Questo si basa su di @ rara_tiru soluzione, ma con alcuni miglioramenti
class GisForm(forms.ModelForm):
"""
This form can be used by any model that has "coordinates" field.
It will show a better looking map than the default one
"""
lat = forms.FloatField(required=False)
lng = forms.FloatField(required=False)
coordinates = PointField(widget=CustomPointWidget(), required=False, srid=4326)
def __init__(self, *args, **kwargs):
super(GisForm, self).__init__(*args, **kwargs)
coordinates = self.initial.get("coordinates", None)
if isinstance(coordinates, Point):
self.initial["lng"], self.initial["lat"] = coordinates.tuple
def clean(self):
data = super(GisForm, self).clean()
if "lat" in self.changed_data or "lng" in self.changed_data:
lat, lng = data.pop("lat", None), data.pop("lng", None)
data["coordinates"] = Point(lng, lat, srid=4326)
if not (data.get("coordinates") or data.get("lat")):
raise forms.ValidationError({"coordinates": "Coordinates is required"})
return data
Ciò consentirà fondamentalmente agli utenti di impostare la posizione sulla mappa o di inserire manualmente valori lat/lng. una volta salvata la mappa rifletterà il valore lng/lat specificed
Le risposte sono grandi per costruire la propria soluzione, ma se si vuole una soluzione semplice che sembra buono ed è facile da usare, provare: http://django-map-widgets.readthedocs.io/en/latest/index.html
È possibile:
- inserire le coordinate
- selezionare direttamente sulla mappa
- guardare gli oggetti da Google Places.
- 1. Geodjango: PointField e GEOSGeometry
- 2. Errore nel salvataggio di geodjango PointField
- 3. Metodi del widget di Twitter per l'aggiornamento dinamico dei widget
- 4. Segnaposto per un widget personalizzato
- 5. Widget valutazione stelle per interfaccia utente jQuery
- 6. Subclassing Tkinter per creare un costume Widget
- 7. Listener per Widget lanciando ViewFlipper eventi
- 8. HTML/CSS per widget di Twitter larghezza
- 9. Limita Android Widget a un'istanza per dispositivo
- 10. Colore di sfondo per GTK_WINDOW_TOPLEVEL Gtk Widget
- 11. QT - Aggiunta di widget per layout orizzontale
- 12. Forza il widget Android per aggiornare
- 13. Profilo di provisioning per l'estensione Today Widget
- 14. Widget Javascript ispirato a UITableView per iPhone?
- 15. Widget grafico per GTK o Qt
- 16. Qt. Foglio di stile per widget personalizzati
- 17. Override overflow per gwt DockLayoutPanel widget
- 18. Django evita di creare PointField nel database quando eseguo python manage.py syncdb
- 19. Gtk3 sostituisce il widget figlio con un altro widget
- 20. Come widget all'interno di un altro widget in QT?
- 21. 1x1 Widget Android mostra come widget 2x2 sullo schermo WXGA720
- 22. Accesso widget di esempio da widget di fuori
- 23. scelta biblioteca per i widget UI per app mobile
- 24. Widget griglia Android per Android tutorial per tablet
- 25. più istanze di widget solo Aggiornamento Ultimo widget di
- 26. yii bootstrap + widget di TbButtonColumn + widget di TbButtonGroup
- 27. PyQt - visualizzazione del widget nella parte superiore del widget
- 28. Ridimensionamento widget Android
- 29. Widget Android con Cordova
- 30. jQuery nel widget
ottengo un errore 'valore di geometria non valida' quando uso questo – fangsterr
@fangsterr È possibile utilizzare '' 'FloatField''' o' '' DecimalField''' per memorizzare le coordinate e di override il metodo di salvataggio per aggiornare il '' 'PointField''', come illustrato [qui] (http://stackoverflow.com/a/22309195/2996101) – raratiru