As great as the Django Admin is, it’s not for most of your users. So what do we do to allow user-submitted geometries?
Cue django-floppyforms which contains handy widgets we can use with our own forms and modelforms to allow geographic input.
Consider this model:
class MyArea(models.Model):
name = models.CharField(max_length=64, unique=True)
point = models.PointField(srid=4326)
polygon = models.MultiPolygonField(srid=4326)
Throw this in views.py
import floppyforms as forms
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
from formstuff.myarea.models import MyArea
class OSMPointWidget(forms.gis.PointWidget, forms.gis.BaseOsmWidget):
map_srid = 900913
class OSMMultiPolygonWidget(forms.gis.MultiPolygonWidget, forms.gis.BaseOsmWidget):
map_srid = 900913
class AreaForm(forms.ModelForm):
point = forms.gis.PointField(widget=OSMPointWidget)
polygon = forms.gis.MultiPolygonField(widget=OSMMultiPolygonWidget)
class Meta:
model = MyArea
def editing(request):
form = AreaForm(request.POST or None)
if form.is_valid():
form.save()
return HttpResponseRedirect('/')
return render_to_response('area.html', {
'form': form,
}, context_instance=RequestContext(request))
and users can drop points and polygons on your model, which will be saved into the database. Do you want the Google basemap instead? Extend BaseGMapWidget instead of BaseOsmWidget, remove the srid attrib, and you’re set. It’s amazing how easy those widgets make it – you don’t even have to know you’re dealing with a geometry in your save method.