Latitude/longitude widget for pointfield?

前端 未结 5 1481
灰色年华
灰色年华 2020-12-16 00:39

Is there a widget for PointField as separate latitude/longitude inputs? Like SplitDateTimeWidget for DateTimeField.

5条回答
  •  天涯浪人
    2020-12-16 01:24

    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

提交回复
热议问题