Is there a widget for PointField as separate latitude/longitude inputs? Like SplitDateTimeWidget for DateTimeField.
This is based on @rara_tiru's solution but with some improvements
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
This will basically allow users to either set location on map or manually put lat/lng values. once saved the map will reflect the specificed lat/lng value