> Hi there, > > I bought the web2py .pdf, and have been reading it, but I'm struggling > a little bit with: > > http://www.web2py.com/book/default/chapter/07#SQLFORM > > Specifically the section "SQLFORM without database IO" > > I have 2 fields, lon & lat I'd like to calculated from a postcode and > enter into the database. I want this to happen automatically, I don't > want the user to see them in the form. > > As you can see below, I've done this by setting dbio=False, computing > the fields from the postcode value then adding them to the forms.var > dict before submitting it all together. Is this a rational way to > accomplish my requirements? > > Thanks in advance! > > Chris > > def adddata(): > form=SQLFORM(db.data, fields=['provider', 'speed', 'postcode', 'ping']) > if form.accepts(request.vars, session, dbio=False): #<-- dbio > false means it doesn't submit till we ask it to > geocoded=__geocode(form.vars.postcode) #<-- so compute the other fields > #add some computed values to the form.vars dictionary for submission > form.vars['lng']=geocoded['lng'] > form.vars['lat']=geocoded['lat'] > #and insert the data into the database > db.data.insert(**dict(form.vars)) > #response.flash puts the flash in this page, session.flash in > the next page of the session > session.flash = 'form accepted' > redirect(URL(r=request, f='index')) > elif form.errors: > response.flash = 'form has errors' > return dict(form=form) >
It might also help to show you the geocode function (changed lon to lng too) def __geocode(address): import urllib import xml.dom.minidom """Returns latitude and longitude when passed a postcode """ geocodeUrl='http://maps.googleapis.com/maps/api/geocode/xml?address=' sensor='&sensor=false' #send the postcode to Google for geocoding dom=xml.dom.minidom.parse(urllib.urlopen(geocodeUrl+address+sensor)) #grab the location element location=dom.getElementsByTagName('location')[0] #pull out the lat & lng elements and remove the <lat> & <lng> tags lat=location.getElementsByTagName('lat')[0].toxml().replace('<lat>','').replace('</lat>','') lng=location.getElementsByTagName('lng')[0].toxml().replace('<lng>','').replace('</lng>','') georesults = {'lat':lat, 'lng':lng} return georesults